题目描述:
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.
class Solution {
public:
int getMoneyAmount(int n) {
// dp[i][j]表示猜[i,j]范围内的数的最小cost,将每个元素初始化为0是因为i==j时,不会对数组更新,直接返回0
vector<vector<int>> dp(n+1, vector<int>(n+1,0));
for (int j=2;j<=n;j++)
{
for (int i=j-1;i>0;i--)
{
if(i+1==j)
{
dp[i][j]=i; //可以选i或j,自然选择i保证cost最小
continue;
}
// 确定i,j之后,令k属于(i,j),dp[i][j]可以用k+max(dp[i][k-1],dp[k+1][j])更新
// 猜k有可能高了,也有可能低了,取两边可能的最大值是为了考虑最坏的情况
int global_min=INT_MAX;
for (int k=i+1;k<j;k++)
global_min=min(global_min,k+max(dp[i][k-1],dp[k+1][j]));
dp[i][j]=global_min;
}
}
return dp[1][n];
}
};