Guess Number Higher or Lower II
URL : https://leetcode.com/problems/guess-number-higher-or-lower-ii/
解题思路:
- 递归的思路是,我可以猜1~n中任意一个数x,然后递归的去猜[1,x) 和(x,n]两段,取他们最大的值。
- 动态规划的思路,自底向上,把长度为[1,2,…,n]的子数组算出来,dp[1][p]则为结果。公式:dp[i][j] = min{k + max{dp[i][k-1],dp[k+1][j]}} 其中i <= k <=j
代码
public int getMoneyAmount(int n) {
return dfs(new int[n+1][n+1], 1, n);
//return DP(new int[n+2][n+2], n);
}
public int dfs(int[][]cache, int start,int end) {
if (start >= end) return 0;
if (cache[start][end] > 0) {
return cache[start][end];
}
int res = Integer.MAX_VALUE;
int mid = (start+end) /2;
do {
res = Math.min(res, mid + Math.max(dfs(cache,start,mid-1),dfs(cache,mid+1,end)));
int tmp = (mid + end) /2;
mid = tmp == mid ? mid++ : tmp;
}while(mid < end);
cache[start][end] = res;
return res;
}
public int DP(int[][]dp, int n) {
for (int l =1;l<=n;l++) {
for (int s = 1; s+l<=n;s++) {
dp[s][s+l] = Integer.MAX_VALUE;
for (int j=(s+s+l)/2;j<=s+l;j++) {
dp[s][s+l] = Math.min(dp[s][s+l], j + Math.max(dp[s][j-1],dp[j+1][s+l]));
}
}
}
return dp[1][n];
}