leetcode 198打家劫舍

复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();

        // dp[i]:前 i 间房能偷到的最大收益
        vector<int> dp(n + 1, 0);

        dp[0] = 0;
        dp[1] = nums[0];

        for (int i = 2; i <= n; i++) {
            // 不偷第 i 间:dp[i-1]
            // 偷第 i 间:dp[i-2] + nums[i-1]
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
        }

        return dp[n];
    }
};

总结

1. dp 的含义

复制代码
dp[i]

表示:

前 i 间房能够偷到的最大收益。

注意:dp[i] 是前 i 间 ,所以对应数组下标是 0 ~ i-1。


2. 递推公式

复制代码
dp[i] = max(dp[i-1], dp[i-2] + nums[i-1]);

考虑第 i 间房:

  • 不偷第 i 间 → dp[i-1]

  • 偷第 i 间 → 前一间不能偷,所以只能用 dp[i-2],再加 nums[i-1]

两种情况取最大值。


3. 为什么是 nums[i-1]

因为:

复制代码
第 i 间房
   ↓
数组下标 i-1

所以代码中是:

复制代码
nums[i-1]

4. 整体思路

可以直接记住这个模板:

复制代码
dp[i]:前 i 个的最优结果

当前元素:
    选它     → dp[i-2] + 当前值
    不选它   → dp[i-1]

dp[i] = max(选,不选)

这就是这道题动态规划的核心。

相关推荐
ZhengEnCi4 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
weixin_307779135 小时前
RAG 面试陷阱——混合检索并非无条件优越:一个条件反转实验
人工智能·python·面试·职场和发展
吞下星星的少年·-·8 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
圣保罗的大教堂8 小时前
leetcode 453. 最小操作次数使数组元素相等 中等
leetcode
aichitang20248 小时前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码8 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-9 小时前
两数之和-C++实现
c++·算法
j7~9 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号9 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯