leetcode 375 猜数字大小2

动态规划

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值