动态规划专题之----198. House Robber

标签(空格分隔): LeetCode


题目链接

动态规划的easy题,可是我还是做了很久,。然而,还是做出来了。
题目的大致意思是给定一个数组,求出不相邻的数之和的最大值。

2 1 1 2 —–》4

1.分解子问题

就拿这个2 1 1 2来说,我们可以先求出2 1 1的最值,然后加上2后再来判断是加2好还是不加2好。其中不加2不是因为加了2结果变小,而是因为我们选择了2 1 1的最后一个1,此时加上2后就不满足不相邻的条件了。于是递推我们可以先计算2 1后再来判断加1的情况。

2.确定状态

dp[i]==j 表示前i+1个数的最值为j

3.确定初始状态

dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1])

4.确定递推公式

dp[i]=Math.max(dp[i2]+nums[i],dp[i1])

5.编码


public class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        if (nums.length == 1) {
            return dp[0];
        }
        dp[1] = Math.max(nums[0], nums[1]);
        if (nums.length == 2) {
            return dp[1];
        }
        for (int i = 2; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[nums.length - 1];
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {2, 1, 1, 2};
        System.out.println(s.rob(nums));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值