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。
class Solution {
public:
int getMoneyAmount(int n) { //有点饶人的DP。最小化最大值。最值问题。DP[i][j]代表i~j选出正确值的答案。
vector<vector<int>> dp(n+2,vector<int>(n+2,0));
for(int k=2;k<=n;k++) {
for(int l=1;l+k-1<=n;l++) {
int r=l+k-1;
int maxx=INT_MIN;
dp[l][r]=INT_MAX;
for(int t=l;t<=r;t++) {
maxx=max(t+dp[l][t-1],t+dp[t+1][r]);
dp[l][r]=min(dp[l][r],maxx);
}
}
}
return dp[1][n];
}
};