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 a win.
解题思路:定义一个二维数组dp[i][j],表示数字在i~j之间时需要付出的最少成本,最后求dp[1][n]。我们可以在i~j之间任意取一个数k,把区间分为两段i~k-1, k+1~j;
此时花费成本的最大值为:max_cost=k+max(dp[i][k-1], dp[k+1][j]);(考虑最坏的情况下,保证猜对的成本);遍历每一个区间,求出需要的最少成本。
class Solution {
public:
int getMoneyAmount(int n) {
if(n==1)
return 0;
vector<vector<int>>dp(n+1, vector<int>(n+1,0));
for(int i=2; i<=n; ++i)
{
for(int j=i-1; j>0; --j)
{
int globmin=INT_MAX;
for(int k=j+1; k<i; ++k)
{
int maxcost=k+max(dp[j][k-1],dp[k+1][i]);
globmin=min(maxcost,globmin);
}
dp[j][i]= j+1==i?j:globmin;//i,j相邻的情况
}
}
return dp[1][n];
}
};