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

leetcode 198 打家劫舍问题,两个dp数组->一个dp数组

在这里插入图片描述
一开始,联想到最长上升子数列,考虑最后一家,打劫或不打劫两种情况,设计了两个dp数组分别表示,代码如下:

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> dp1(n+1, 0), dp2(n+1, 0);dp1[1] = nums[0];for(int i=2;i<=n;i++){dp1[i] = nums[i-1] + max(dp1[i-2], dp2[i-1]);dp2[i] = max(dp1[i-1], dp2[i-1]);}return max(dp1[n], dp2[n]);}
};

但是很快发现,做的复杂了,实际一个dp数组就可以搞定:

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

这里面没有考虑结尾的情况。我们可以这么想,在当前状态下,这个房子只有打或者不打两种情况,如果打,那i-1肯定是不打的,所以我们只需要考虑dp[i-2]即可。如果不打,那么考虑dp[i-1]即可,这种做法可以将结尾状态隐含表示,是更优的做法。

http://www.dtcms.com/a/392075.html

相关文章:

  • 嵌入式ARM架构学习8——串口
  • Motion-sensor基础应用
  • 今日行情明日机会——20250919
  • 跟着Carl学算法--动态规划【7】
  • T拓扑结构的特性
  • 第一章 开发工具与平台介绍
  • 线上环境出了个问题:Young GC看起来很正常,但Full GC每天发生20多次,每次都让CPU飙得很高。你会怎么去排查和解决?
  • Linux系统多线程总结
  • 【PyTorch】单对象分割
  • 1.3 状态机
  • 软件测试之自动化测试概念篇(沉淀中)
  • 二分答案:砍树
  • 串口通信简介
  • 模运算(Modular Arithmetic)的性质
  • 破解“双高“电网难题,进入全场景构网新时代
  • 企业实训|AI技术在职能办公领域的应用场景及规划——某央企汽车集团
  • 双向链表与通用型容器
  • NodeRAG检索知识图谱复杂数据的启发
  • 卡尔曼滤波对非线性公式建模的详细步骤
  • Microsoft 365 中的 Entitlement Management(基础版)功能深度解析
  • 本科期间的技术回忆(流水账记录)
  • zotero和小绿鲸联合使用
  • Linux系统之logrotate的基本使用
  • 硬核突破!基于 ComfyUI + pyannote 实现 infiniteTalk 多轮对话数字人:从语音端点检测到上下文感知的闭环
  • 【LeetCode 每日一题】2197. 替换数组中的非互质数
  • 城市水资源与水环境:植被如何重塑地球水循环?
  • TransBench:阿里国际等推出的多语言翻译评测体系
  • Windows启动Minio服务
  • 技术原理与癌症筛查的适配性问题
  • 集合通信算法总结