leetcode刷题之动态规划

文章讲述了使用动态规划解决两道打家劫舍问题的JavaScript代码实现。第一题是常规的数组问题,寻找能盗取的最大金额;第二题增加了条件,所有房屋围成一个圈,且第一个和最后一个不能同时被抢劫。通过维护两个状态数组分别计算包含首项和不包含首项的最大收益。
摘要由CSDN通过智能技术生成

198.打家劫舍

var rob = function(nums) {
    //数组问题   动态规划   nums[i]是下标为i的数组之前的 可以盗取的最大金额
    let dp = []
    let n = nums.length
    dp[0] = nums[0]
    dp[1] = Math.max(nums[0],nums[1])
    for(let i=2;i<n;i++){
        //取  盗取当前的结点 和 不盗取当前节点  二者的最大值
        dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1])
    }
    return dp[n-1]
};

213.打家劫舍2

var rob = function(nums) {
    //这题比上一个多了一个限定条件  所有的房屋围成了一个圈
    //第一个和最后一个不能同时出现
    let n = nums.length
    if(n==0) return 0
    if(n==1) return nums[0]
    let dp1 = []
    let dp2 = []
    //不包含第一个  队列从 1 到 n-1
    dp1[1] = nums[1]
    dp1[2] = Math.max(nums[1],nums[2])
    for(let i = 3;i<=n-1;i++){
        dp1[i] = Math.max(nums[i]+dp1[i-2],dp1[i-1])
    }
    //包含第一个   队列从 0 到 n-2   
    dp2[0] = nums[0]
    dp2[1] = Math.max(nums[0],nums[1])
    for(let j=2;j<=n-2;j++){
        dp2[j] = Math.max(nums[j]+dp2[j-2],dp2[j-1])
    }
    return Math.max(dp1[n-1],dp2[n-2])
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值