House Robber 基本动态规划:一维--力扣101算法题解笔记

7.2House Robber 基本动态规划:一维

题目描述

假如你是一个劫匪、并且决定抢劫一条街道上的房子。每个房子内的钱财数量都不同。但是如果你抢了两栋相邻的房子,就会触发警报机关。求在不触发机关的情况下,最多可以抢劫多少钱。

输入输出样例

Input :2, 7, 9, 3, 1

Output:12

题解

定义一个数组dp,dpi表示抢劫到第i个房子时,可以抢劫的最大数量。要考虑dpi,此时可以抢劫的最大数量有两种可能,一种我们选择不抢劫这个房子,此时累计的金额就得-1,也就是dpi-1;另一种选择是抢劫这个房子,因为不能抢劫第i-1个房子,这样会触发警报,那么此前累积的最大金额只能是dpi-2,所以得到一个状态转移方程为dpi=max(dpi-1,numsi-1,+dpi-2)

我们利用这个状态方程就可以把逻辑问题变成数学问题然后设计算法解决了

"因为不能抢劫第i-1个房子,这样会触发警报,那么此前累积的最大金额只能是dpi-2"

对这句话的解释:

既然第 i-1 个房子不抢,那 "抢劫到第 i 个房子" 的最大金额,就等于 "第 i 个房子的金额" + "抢劫到第 i-2 个房子时的最大金额";这里的 "抢劫到第 i-2 个房子时的最大金额" 就是 dp[i-2] ------ 因为 dp i-2 已经包含了 "抢劫到第 i-2 个房子时能拿到的所有最优情况"(不管第 i-2 个房子抢没抢,它都是到 i-2 为止的最大值)

当然,这题目跟上一个一样,还是只用到pre1和pre2,两个数组,直接简化就完事了。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int rob(vector<int>& nums) {
    if (nums.empty())    return 0;
    int n = nums.size();
    if (n == 1)  return nums[0];
    int pre2 = 0, pre1 = 0, cur;
    for (int i = 0; i < n; ++i) {
        cur = max(pre2 + nums[i], pre1);
        pre2 = pre1;
        pre1 = cur;
    }
    return cur;
}

int main() {
    vector<int> nums = { 2, 7, 9, 3, 1 };
    cout << rob(nums) << endl;
    return 0;
}
相关推荐
滕州市燕猫虎计算机科技工作室个体工商户20 分钟前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
志尊宝2 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
后季暖3 小时前
电商问数笔记(2)
笔记
xier_ran3 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
Nil2084 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing4 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_35 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
星恒随风5 小时前
Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解
linux·运维·笔记·学习·状态模式
罗西的思考5 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (7)— 混合机制
笔记·学习
loulanyue_5 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法