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(选,不选)

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

相关推荐
Shaoshing2 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_32 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
loulanyue_2 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院2 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan3 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生3 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan3 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan3 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
大雄很用心3 小时前
如何理解时间复杂度与空间复杂度?| 面试刷题笔记02
算法