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;
}
相关推荐
学废了wuwu1 分钟前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下12 分钟前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月19 分钟前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基23 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana228 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
AOwhisky30 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
砚凝霜31 分钟前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm
To_OC8 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎9 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC10 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode