Guess Number Higher or Lower II
题目
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 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 7 + 21.
Given a particular n ≥ 1, find out how much money you need to have to guarantee a win.
分析
这个题目,理解题目问什么比较tricky。。
大意如下
给你n个数字(1 2 3 4 .... n)
answer = min_maxcost = No matter what the target is, the min_maxcost can cover the cost of guessing it from the n numbers.
but you would ask, then why not just return sum of (1...n)?
well, we are looking for the minimum one, and so min_maxcost is the lower bound for all such cost
答案
public int getMoneyAmount(int n) {
int[][] dp = new int[n + 1][n + 1];
for(int i = 0; i < dp.length; i++)
Arrays.fill(dp[i], -1);
return recur(dp, 1, n);
}
public int recur(int[][] dp, int left, int right) {
if(left >= right) return 0;
if(dp[left][right] != -1) return dp[left][right];
// No cost for guessing a number in range of size 1, it has to be correct
int min = Integer.MAX_VALUE;
for(int i = left; i <= right; i++) {
min = Math.min(min, i + Math.max(recur(dp, left, i - 1), recur(dp, i + 1, right)));
}
dp[left][right] = min;
return dp[left][right];
}