2021.11.12 - 147.猜数字大小 II

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];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44021223/article/details/121284819
ii