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.
/* 猜数字 一直到猜对为止
* 目的不是猜的次数最小 而是猜错的数总和最小 二分法没用
* minmax cost 在所有情况中考虑最坏的情况(max) 然后采取最优策略(min)
* maxmin profit
* 具体而言: 即dp[i][j] 为猜i-j中任意一个数的花费 先猜k位置 然后i~k-1 k+1~j 这两个中取最大的(事先并不知道数字落在哪里考虑最坏)
* 然后取一个最好的k使得话费最小
* */
class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
for(int i=1;i<n;i++){
dp[i][i+1] = i;
}
for(int i=n-2;i>0;i--){
for(int j=i+2;j<=n;j++){
int tmpmin=INT_MAX;
for(int k=i+1;k<j;k++){
tmpmin = min(tmpmin, k+max(dp[i][k-1],dp[k+1][j]));
}
dp[i][j] = tmpmin;
}
}
return dp[1][n];
}
};