1. 题目
2. 思路
(1) 动态规划
- 定义动态规划二维数组dp[][],dp[i][j]表示在区间[i,j]内确保胜利的最小金额,因此,目标是求出dp[1][n]。
- 假设在区间[i,j]内给出的数字是k且猜错,则为了确保胜利需要支付的金额是cost=k+Math.max(dp[i][k-1],dp[k+1][j]),即在区间[i,k-1]和区间[k+1,j]内取确保胜利的最大金额,再加上k,才能在区间[i,j]内确保胜利。
- 为了获取在区间[i,j]内确保胜利的最小金额,需要遍历区间[i,j]内的每一个数字作为k,计算其cost,最后取最小值作为dp[i][j]。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int getMoneyAmount(int n) {
int[][] dp = new int[n + 1][n + 1];
for (int i = n - 1; i >= 1; i--) {
for (int j = i + 1; j <= n; j++) {
int min = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
int cur = k + Math.max(dp[i][k - 1], dp[k + 1][j]);
min = Math.min(min, cur);
}
dp[i][j] = min;
}
}
return dp[1][n];
}
}