leecode-打家劫舍(最优算法二维dp)

力扣198.打家劫舍
题目连接:力扣198.打家劫舍
题目详情:
在这里插入图片描述
毫无疑问,看到这道题就应该想到是动态规划啦!
我的思路是这样子:
使用二维dp来维护,分别表示:dp[0][1],dp[1][1]分别表示第一家在不被打劫时所可以偷的钱,第一家在被打劫之后可以偷的钱。
算法过程是这样:在这一家,如果想要偷钱,就必须保证前面一家不被打劫,也就是可以取前面的前面那一家在被打劫和不被打劫的最大值,然后加上这一家的钱。如果不打算偷这一家,那么取前面一家在被打劫和不被打劫的最大值即可,初始化时,可以首先知道第一家打劫和不被打劫的情况,同时考虑算法会越到前面的两位,所以dp[0][0]需要初始化为0,防止数组越界,我们直接看下算法:

class Solution {
public:
    int rob(vector<int>& nums) {
        int ans = 0;
        int dp[2][105];
        dp[0][0] = 0;
        dp[1][0] = 0;
        dp[0][1] = 0;
        dp[1][1] = nums[0];
        ans = dp[1][1];
        for(int i = 1; i < nums.size(); i++){
            dp[0][i+1] = max(dp[0][i], dp[1][i]);
            dp[1][i+1] = max(dp[0][i-1], dp[1][i-1]) + nums[i];
            ans = max(ans, max(dp[0][i+1], dp[1][i+1]));
        }
        return ans;
    }
};

结果:
在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值