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

动态规划:从记忆化搜索到递推 打家劫舍

目录

LeetCode198 打家劫舍

 1、递归搜索+保存计算结果=记忆化搜索

2、1:1翻译成递推

3、空间优化

LeetCode213 打家劫舍II

LeetCode198 打家劫舍

 1、递归搜索+保存计算结果=记忆化搜索

回溯三问:

(1)当前操作?枚举第i个房子选/不选

(2)子问题?从前i个房子中的得到的最大金额和

(2)下一个子问题? 分类讨论:

        不选:从前i-1个房子中得到的最大金额和

        选:从前i-2个房子中得到的最大金额和+nums[i]

记忆化搜索:把递归的计算结果保留下来,下次递归到同样的入参时,就直接返回先前保存的结果。

/** @lc app=leetcode.cn id=198 lang=cpp** [198] 打家劫舍*/// @lc code=start
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();vector<int> cache(n,-1);auto dfs=[&](auto&& dfs,int i)->int{if(i<0) return 0;if(cache[i]!=-1) return cache[i]; return cache[i]=max(dfs(dfs,i-1),dfs(dfs,i-2)+nums[i]);};return dfs(dfs,n-1);}
};

时间复杂度:O(n)

空间复杂度:O(n)

2、1:1翻译成递推

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

时间复杂度:O(n) 

空间复杂度:O(n)

3、空间优化

class Solution {
public:int rob(vector<int>& nums) {int f0=0,f1=0;for(int x:nums){int new_f=max(f1,f0+x);f0=f1;f1=new_f;}return f1;}
};

时间复杂度:O(n) 

空间复杂度:O(1)

LeetCode213 打家劫舍II

分类讨论,考虑是否偷 nums[0]:

如果偷 nums[0],那么 nums[1] 和 nums[n−1] 不能偷,问题变成从 nums[2] 到 nums[n−2] 的非环形版本,调用 198 题的代码解决;
如果不偷 nums[0],那么问题变成从 nums[1] 到 nums[n−1] 的非环形版本,同样调用 198 题的代码解决。

/** @lc app=leetcode.cn id=213 lang=cpp** [213] 打家劫舍 II*/// @lc code=start
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:int rob1(vector<int>& nums,int start,int end){int f0 = 0, f1 = 0;for (int i = start; i < end; i++) {int new_f = max(f1, f0 + nums[i]);f0 = f1;f1 = new_f;}return f1;} int rob(vector<int>& nums) {int n=nums.size();return max(nums[0] + rob1(nums, 2, n - 1), rob1(nums, 1, n));}    
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java接口interface(内含练习)
  • 树莓派开发笔记13-树莓派环境下的CSI摄像头实验
  • centos 虚拟机器刚刚安装没有ip地址的问题
  • 微软AI人工智能认证有哪些?
  • ChatGPT不同模型在论文写作中的优势和应用
  • 044—pandas 按组将属性和值转为行
  • GRL CVPR2023图像修复 使用笔记
  • IDM是海外加速器吗 IDM在国内好用吗
  • leetcode 438.找到字符串中所有字母异位词
  • 突破编程:C++中的组合模式(Composite Pattern)
  • linux下搭建MySQL8.0.25一主一从
  • rust 日志记录与跟踪
  • 沉浸式解压小视频在哪找?非常减压的几个视频素材网站分享
  • NLP发展脉络-->特征优化阶段
  • SAM 2——视频和图像实时实例分割的全新开源模型
  • 【node学习】协程
  • Apache Pulsar 2.1 重磅发布
  • linux学习笔记
  • python 装饰器(一)
  • quasar-framework cnodejs社区
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Sublime Text 2/3 绑定Eclipse快捷键
  • windows下如何用phpstorm同步测试服务器
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #1014 : Trie树
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (算法)Game
  • (转)拼包函数及网络封包的异常处理(含代码)
  • **PHP分步表单提交思路(分页表单提交)
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 设计模式初探
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET使用存储过程实现对数据库的增删改查
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • [20170713] 无法访问SQL Server
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Angular] 笔记 20:NgContent
  • [ARC066F]Contest with Drinks Hard
  • [AutoSar NVM] 存储架构
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++]: std::move
  • [CISCN2019 华东南赛区]Web11
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [FT]chatglm2微调
  • [leetcode 189][轮转数组]