前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 213. 打家劫舍 II(DP)

LeetCode 213. 打家劫舍 II(DP)

作者头像
Michael阿明
发布2020-07-13 15:34:27
4040
发布2020-07-13 15:34:27
举报

1. 题目

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

类似题目: LeetCode 198. 打家劫舍(DP) LeetCode 337. 打家劫舍 III(记忆化+递归)

2. 动态规划解题

在前一题LeetCode 198 的前提下,换一种思考

  1. 第一个房间,那么最后一个不偷,dp数组从0(第一个)到n-2(倒数第2个),获得的最大金额 m1
  2. 第一个房间不偷,那么最后一个,dp数组从1(第二个)到n-1(倒数第1个),获得的最大金额 m2
  3. 取 max(m1,m2)为最大金额
代码语言:javascript
复制
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size(), i, m1, m2;
        if(n == 0)
        	return 0;
        else if(n == 1)
        	return nums[0];
        else if(n == 2)
        	return max(nums[0],nums[1]);
        int dp[n] = {0};
        //第一间房子,偷,那么最后一间n-1不能偷
        dp[0] = nums[0];
        dp[1] = max(nums[0],nums[1]);
        for(i = 2; i <= n-2; ++i)
        {
        	dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
        }
        m1 = dp[n-2];
        //第一间房子,不偷,那么最后一间n-1能偷
        dp[1] = nums[1];
        dp[2] = max(nums[1],nums[2]);
        for(i = 3; i <= n-1; ++i)
        {
        	dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
        }
        m2 = dp[n-1];
        return max(m1,m2);
    }
};
  • 观察到上面转态转移公式只跟前两个转态有关,可以进行压缩,节省空间,见前一篇 LeetCode 198,不再写出。
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 动态规划解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档