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.
For each number x in range[i~j]
we do: result_when_pick_x = x + max{DP([i~x-1]), DP([x+1, j])}
–> // the max means whenever you choose a number, the feedback is always bad and therefore leads you to a worse branch.
then we get DP([i~j]) = min{xi, … ,xj}
–> // this min makes sure that you are minimizing your cost.
class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int>> dp(n+1,vector<int>(n+1,0));
return helper(dp,1,n);
}
int helper(vector<vector<int>>& dp,int s,int e){
if(s>=e) return 0;
if(dp[s][e] != 0) return dp[s][e];
int result = INT_MAX;
for(int i = s; i <= e;i++){
int tmp = i + max(helper(dp,s,i-1),helper(dp,i+1,e));
result = min(result,tmp);
}
dp[s][e] = result;
return result;
}
};
//自顶向下
class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int>> dp(n+1,vector<int>(n+1,0));
for(int j = 2; j < n+1;j++){
for(int i =j -1; i >=0;i--){
int globalMin = INT_MAX;
for(int k = i+1; k < j; k++){
int localMax = k + max(dp[i][k-1],dp[k+1][j]);
globalMin = min(globalMin,localMax);
}
dp[i][j] = i+1 == j?i:globalMin;
}
}
return dp[1][n];
}
};