leetcode 213. House Robber II

和第198题没有本质区别。

定义dp数组,n是房间总个数。dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,按照这个定义,dp[n-1]就是答案。dp[0]一直到dp[n-2]的求法和第198题一模一样,唯独dp[n-1]需要特别考虑。

对于最后一个房间(即第n-1号房间),只有两种可能,偷或者不偷。

  1. 如果不偷第n-1号房间,则dp[n-1] = dp[n-1-1]。
  2. 如果偷第n-1号房间,则除了像第198题一样不能偷第n-2号房间外,还要求一定不能偷第0号房间。问题可以转化为,不考虑第0号房间,只考虑从第1号房间一直到第n-1-2号房间。因此另外定义一个dp2数组。dp2[i]表示从第1号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,dp2[0]不定义。dp[n-1] = dp2[n-1-2] + nums[n-1]。

dp[n-1]取前述两种情况的最大值,dp[n-1] = max(dp[n-1-1], dp2[n-1-2] + nums[n-1]);

第一版代码

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        //dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额
        //按照这个定义,dp[n-1]就是答案。
        vector<int> dp(n);
        dp[0] = nums[0];
        if(n ==1)   return dp[0];
        dp[1] = max(nums[0],nums[1]);
        if(n ==2)   return dp[1];
        //dp[0]一直到dp[n-2]的求法和第198题一模一样,唯独dp[n-1]需要特别考虑。
        for(int i = 2;i < n -1;i++){
            dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
        }

        //dp2[i]表示从第1号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,dp2[0]不定义
        vector<int> dp2(n);
        dp2[1] = nums[1];
        dp2[2] = max(nums[1],nums[2]);
        for(int i = 3; i < n;i++){
            dp2[i] = max(dp2[i-2]+nums[i],dp2[i-1]);
        }

        dp[n-1] = max(dp2[n-1-2]+nums[n-1],dp[n-1-1]);
        return dp[n-1];
    }
};

求dp2和求dp可以在一次遍历中求取。

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        //dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额
        //按照这个定义,dp[n-1]就是答案。
        vector<int> dp(n);
        dp[0] = nums[0];
        if(n ==1)   return dp[0];
        dp[1] = max(nums[0],nums[1]);
        if(n ==2)   return dp[1];
        if(n ==3)   return max(max(nums[0],nums[1]),nums[2]);

        //dp2[i]表示从第1号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,dp2[0]不定义
        vector<int> dp2(n);
        dp2[1] = nums[1];
        dp2[2] = max(nums[1],nums[2]);
        for(int i = 2;i < n -1;i++){
            if(i>=3)
                dp2[i] = max(dp2[i-2]+nums[i],dp2[i-1]);
            dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
        }
        //dp[n-1]需要特别考虑
        dp[n-1] = max(dp2[n-1-2]+nums[n-1],dp[n-1-1]);
        return dp[n-1];
    }
};
相关推荐
天上路人2 分钟前
采用AI神经网络降噪算法的语言降噪消回音处理芯片NR2049-P
深度学习·神经网络·算法·硬件架构·音视频·实时音视频·可用性测试
chao_78915 分钟前
手撕算法(定制整理版2)
笔记·算法
AndrewHZ2 小时前
【图像处理基石】什么是油画感?
图像处理·人工智能·算法·图像压缩·视频处理·超分辨率·去噪算法
.格子衫.2 小时前
015枚举之滑动窗口——算法备赛
数据结构·算法
J先生x3 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
爱coding的橙子6 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
Dream it possible!9 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!10 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue10 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
jiunian_cn11 小时前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio