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

198. 打家劫舍【C++】【动态规划】

题目描述

打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400

思路

读题后可知,当前盗取的总金额 = max(上一家盗取的总金额(这一家不盗取),上上一家盗取的总金额+盗取当前这一家金额),由此可见满足当前状态由以前状态影响有关,选择使用动态规划。dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);

  1. 确定dp数组含义
    dp[i]:表示盗取[0,i]的总金额
vector<int> dp(nums.size(), 0);
  1. 初始化
    从递推公式上看,需要初始化dp[0]、dp[1],其他值由前两个值确定。
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
  1. 递推公式
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
  1. 遍历顺序
for (int i = 2; i < nums.size(); i++) {
    dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}

整体代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n, 0);
        if (n == 1) {    //边界处理
            return nums[0];
        } else if (n == 2) {
            return max(nums[0], nums[1]);
        }
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        for (int i = 2; i < n; i++) {
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[n - 1];
    }
};

只需要注意数组长度小于等于2的情况。

相关题目

打家劫舍 II
337. 打家劫舍 III


http://www.kler.cn/a/399201.html

相关文章:

  • 解决 IDEA 修改代码重启不生效的问题
  • 技术周总结 11.11~11.17 周日(Js JVM XML)
  • 某某科技笔试题
  • 基于大语言模型意图识别和实体提取功能;具体ZK数值例子:加密货币交易验证;
  • 【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
  • onlyoffice Command service(命令服务)使用示例
  • Nature Electronics|综述| 柔性脑机接口 (健康监测/柔性电极/可植入式电子/可穿戴电子/脑机接口/柔性电子/人机交互)
  • 【Mysql】Mysql函数(上)
  • 实用教程:如何无损修改MP4视频时长
  • leetcode-44-通配符匹配
  • Jenkins + gitee 自动触发项目拉取部署(Webhook配置)
  • 【JSOO】设计模式
  • 2024-11-15 Element-ui的tab切换中table自适应宽度无法立即100%的问题
  • Linux高阶——1116—SOCKET套接字基础
  • 数据结构大致分类
  • 函数式组件和类组件的区别
  • WPF+MVVM案例实战、自定义控件和特效实现
  • 解析安卓镜像包和提取DTB文件的操作日志
  • Unity6 + Android Studio 开发环境搭建【备忘】
  • 机器学习实战笔记32-33:网格搜索原理、参数详解及代码实操
  • 关于性能测试:数据库的 SQL 性能优化实战
  • STL序列式容器之priority_queue
  • vue使用List.reduce实现统计
  • 前端开发设计模式——责任链模式
  • acwing算法基础03-递归,枚举
  • 【JavaScript】call、apply、bind