375. Guess Number Higher or Lower II

来源:互联网 发布:网络卖彩票会坐牢吗 编辑:程序博客网 时间:2024/05/20 13:16

We are playing the Guess Game. The game is as follows:

I pick a number from 1 to n. You have to guess which number I picked.

Every time you guess wrong, I'll tell you whether the number I picked is higher or lower.

However, when you guess a particular number x, and you guess wrong, you pay $x. You win the game when you guess the number I picked.

Example:

n = 10, I pick 8.First round:  You guess 5, I tell you that it's higher. You pay $5.Second round: You guess 7, I tell you that it's higher. You pay $7.Third round:  You guess 9, I tell you that it's lower. You pay $9.Game over. 8 is the number I picked.You end up paying $5 + $7 + $9 = $21.

Given a particular n ≥ 1, find out how much money you need to have to guarantee awin.

Hint:

  1. The best strategy to play the game is to minimize the maximum loss you could possibly face. Another strategy is to minimize the expected loss. Here, we are interested in thefirst scenario.
  2. Take a small example (n = 3). What do you end up paying in the worst case?
  3. Check out this article if you're still stuck.
  4. The purely recursive implementation of minimax would be worthless for even a small n. You MUST use dynamic programming.
  5. As a follow-up, how would you modify your code to solve the problem of minimizing the expected loss, instead of the worst-case loss?



猜数字的游戏,求猜中1~n中任意一个数至少要花费多少。就是要求最大值中的最小值。用动态规划的方法。用二维数组dp来保存状态,dp[j][i]表示猜中j到i中任意一个数最少的花费。对于某个i和j,若dp[j][k-1]和dp[k+1][i]已经确定,也就是猜中j到k-1区间的任意一个数的最少花费和猜中k+1到i区间的任意一个数的最少花费已经确定(这就要求i从2递增,j从i-1递减),则现在猜k从而猜中j到i中任意一个数的最大花费是k+max(dp[j][k-1], dp[k+1][i])。遍历取k为i+1到j-1中的数,计算每个k对应的最大值,然后取这些最大值的最小值,就能计算出猜中j到i中任意一个数的最小花费。注意的是如果i比j大1,也就是区间只有两个数时,猜小的数能是最大花费最小化(猜错了花费j)。因为i从2递增,j从i-1递减,所以最后得到dp[1][n],这就是答案。


代码:

class Solution{public:int getMoneyAmount(int n){vector<vector<int> >dp(n + 1, vector<int>(n + 1, 0));for(int i = 2; i <= n; ++i){for(int j = i - 1; j >= 1; --j){int Min = INT_MAX;for(int k = j + 1; k <= i - 1; ++k){int Max = k + max(dp[j][k-1], dp[k+1][i]);Min = min(Min, Max);}dp[j][i] = j+1 == i ? j : Min;}}return dp[1][n];}};


0 0
原创粉丝点击