当前位置: 首页 > news >正文

leetcode 198. House Robber

本题是动态规划问题。

第一步,明确并理解dp数组以及下标的含义

dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,具体怎么偷这里不考虑,第i+1号及之后的房间也不考虑。换句话说,dp[i]也就是只考虑[0,i]号房间,无论怎么偷可以偷到的最大金额。

按照这个定义,dp[n-1]就是答案。需要注意的是,dp[i]一定能求到值,不代表一定是偷了第i号房间才求得dp[i]。

第二步,明确并理解递推公式

考虑第i号房间,只有两种可能,偷或者不偷。

偷第i号房间,则第i-1号房间肯定不能偷,此时能获得的总金额为dp[i] = dp[i-2] + nums[i]。

不偷第i号房间,此时dp[i]应该等于dp[i-1]。

第三步,理解dp数组如何初始化

dp[0]应该初始化为第0号房间的金额。因为只有一间房的时候,能偷到的最大金额显然就是把它偷了。

dp[1],含义是从第0号房间和第1号房间偷,能偷到的最大金额。由于相邻的房间不能都偷,所以dp[1]= max(nums[0],numd[1]);

i>=2的dp[i]可以不初始化,或者说无论初始化为多大都没关系,因为dp[i]只和dp[i-1],dp[i-2],nums[i]有关系。

第四步,理解遍历顺序

因为dp[i]依赖于它前面的dp[i-1]和dp[i-2],所以i的遍历顺序肯定要从小到大。

代码

按照上面的思路,先初始化dp[0]和dp[1],再让i从2开始遍历,含义更加明确,代码更好理解,如下所示:

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 < 2)
            return dp[0];
        dp[1] = max(nums[0],nums[1]);
        for(int i = 2;i < n;i++){
            //偷第i号房间
            int temp1 = dp[i-2] + nums[i];
            //不偷第i号房间
            int temp2 = dp[i-1];
            dp[i] = max(temp1,temp2);
        }
        return dp[n-1];
    }
};

但实际上,也可以不初始化让i从0开始遍历,代码如下所示:

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

相关文章:

  • 一天时间,我用AI(deepseek)做了一个配色网站
  • 哈希表-算法小结
  • 01_通过调过api文字生成音频示例
  • 【C数据结构】 TAILQ双向有尾链表的详解
  • Vue2 老项目升级 Vue3 深度解析教程
  • [推荐]AI驱动的知识图谱生成器(AI Powered Knowledge Graph Generator)
  • 符号右移“ >>= “ 与 无符号右移“ >>>= “ 的区别
  • 信息安全管理与评估2024年江西省赛样题一阶段答案截图
  • 穿透三层内网VPC2
  • C++STL语法速记
  • P5738 【深基7.例4】歌唱比赛
  • 【源码】SpringMvc源码分析
  • [Dify] 基于明道云实现金融业务中的Confirmation生成功能
  • d202548
  • 库magnet使用指南
  • 少儿编程 scratch四级真题 2025年3月电子学会图形化编程等级考试Scratch四级真题解析(选择题)
  • SQLite-Web:一个轻量级的SQLite数据库管理工具
  • 智慧乡村数字化农业全产业链服务平台建设方案PPT(99页)
  • MATLAB2022b安装
  • 文件操作和 IO - 3
  • 19世纪的“表征之场”:弗洛伊德的精神分析椅
  • 波兰总统选举第一轮投票结束,出口民调显示将进入第二轮投票
  • 国际观察丨美中东政策生变,以色列面临艰难选择
  • 国内规模最大女子赛艇官方赛事在沪启航,中外41支队伍逐浪
  • 外企聊营商|上海仲裁:化解跨国企业纠纷的“上海路径”
  • 广西壮族自治区党委常委会:坚决拥护党中央对蓝天立进行审查调查的决定