Dynamic programming problem