动态规划
dp[i][j] 表示区间左边是i,右边是j
这里从后往前遍历,因为后面用到了dp[k + 1][r],所以需要从后往前遍历
class Solution {
public int getMoneyAmount(int n) {
//动态规划
// f(l,r) 存储的是在(l,r)区间内的最大值
//假设 1 - n ,可以选择 1 ... n -1
//如果选择1,错了的话 1 + f(2,n)
// f(l,r) 如果在(l,r)这个区间中选择了x,那么遍历x从1到r -1 表示从1选到r-1,找到所有情况的最小值 f(l,r) = x + Math.max(f(l,x - 1),f(x + 1,r))
//从l开始,往后遍历每一个r
int[][] dp = new int[n + 1][n + 1];
//i从后往前
for(int l = n - 1; l >= 1; l--){
for(int r = l + 1; r <= n; r++){
dp[l][r] = Integer.MAX_VALUE;
for(int k = l; k < r; k++)
dp[l][r] = Math.min(dp[l][r], k + Math.max(dp[l][k - 1],dp[k + 1][r]));
}
}
return dp[1][n];
}
}