二刷代码随想录——动态规划day47

文章目录

  • 前言
    • 动态规知识点
  • 动规五部曲
  • 一、198. 打家劫舍
  • 二、213. 打家劫舍 II
  • 三、337. 打家劫舍 III
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!
二刷决定精刷了,于是参加了卡子哥的刷题班,训练营为期60天,我一定能坚持下去,迎来两个月后的脱变的,加油!
推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录

动态规知识点

终于来到了守关boss。。。

动态规划中每一个状态一定是由上一个状态推导出来的

动规是由前一个状态推导出来的,而贪心是局部直接选最优的。

动规五部曲

动态规划一般分为如下五步:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组
        //1. 确定dp数组(dp table)以及下标的含义//2. 确定递推公式//3. dp数组如何初始化//4. 确定遍历顺序//5. 举例推导dp数组

解题时候多把dp数组打印出来,看看究竟是不是按照自己思路推导的。

写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。

如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。

如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

一、198. 打家劫舍

198. 打家劫舍
Note:经典题目打家劫舍

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 0) return 0;if (nums.size() == 1) return nums[0];//1. 确定dp数组(dp table)以及下标的含义//dp[i]:i间房屋最多可以偷窃的金额为dp[i]。vector<int> dp(nums.size());//2. 确定递推公式//dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);//3. dp数组如何初始化dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);//4. 确定遍历顺序for (int i = 2; i < nums.size(); i++) {dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);}//5. 举例推导dp数组return dp[nums.size() - 1];}
};

二、213. 打家劫舍 II

213. 打家劫舍 II
Note:经典动规打家劫舍第二题

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 0) return 0;if (nums.size() == 1) return nums[0];//分两种情况考虑int result1 = robRange(nums, 0, nums.size() - 2); //不考虑尾元素int result2 = robRange(nums, 1, nums.size() - 1); //不考虑头元素return max(result1, result2);}int robRange(vector<int>& nums, int start, int end) {if (start == end) return nums[start];        //1. 确定dp数组(dp table)以及下标的含义//dp[i]:i间房屋最多可以偷窃的金额为dp[i]。vector<int> dp(nums.size());//2. 确定递推公式//dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);//3. dp数组如何初始化dp[start] = nums[start];dp[start + 1] = max(nums[start], nums[start + 1]);//4. 确定遍历顺序for (int i = start + 2; i <= end; i++) {dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);}//5. 举例推导dp数组return dp[end];}
};

三、337. 打家劫舍 III

337. 打家劫舍 III
Note:经典动规打家劫舍第三题

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int rob(TreeNode* root) {vector<int> result = robTree(root);return max(result[0], result[1]);}vector<int> robTree(TreeNode* cur) {if (cur == NULL) return vector<int>{0, 0};vector<int> left = robTree(cur->left);vector<int> right = robTree(cur->right);int val1 = cur->val + left[0] + right[0];int val2 = max(left[0], left[1]) + max(right[0], right[1]);return {val2, val1};}
};

总结

动态规划法,和分治法极其相似。区别就是,在求解子问题时,会保存该子问题的解,后面的子问题求解时,可以直接拿来计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元函数与运行期(普通)函数的区别,为什么要用元函数?

看以下面代码你就知道了&#xff1a; /// <summary> /// 求整数所对应的二进制表示中1的个数 /// </summary> /// <typeparam name"Input"></typeparam> /// 创建时间&#xff1a;2024-01-24 抄自&#xff1a;《动手打造深度学习框架》 21…

深度学习模型部署(十)模型部署配套工具二

上篇blog讲了trtexec和onnx_graphsurgeon两个工具&#xff0c;一个用于将onnx转化为trt模型&#xff0c;另一个用于对onnx模型进行修改。这篇blog讲polygraphy和nsight systems&#xff0c;前者用于进行模型优化以及结果验证&#xff0c;后者用于性能分析。 polygraph polygra…

️ 亲身体验!探索工业界最前沿的安全帽数据集,你的工作安全靠它保驾护航!

一、SHWD安全帽佩戴检测数据集&#xff08;Safety helmet (hardhat) wearing detect dataset&#xff09; 介绍 SHWD 提供了用于安全头盔佩戴和人头检测的数据集。它包括7581张图像&#xff0c;其中9044个人体安全头盔佩戴对象&#xff08;正面&#xff09;和111514个正常头部…

渐开线花键不是齿轮?

在和一位小伙伴交流时&#xff0c;他认为齿轮和花键不一样&#xff0c;那花键是不是齿轮呢&#xff1f;老师傅们可以绕开了&#xff0c;我觉得对于一些平时接刚刚接触齿轮&#xff0c;或者很少接触的朋友来说&#xff0c;还是有必要聊一聊这个话题。 首先这个问题并不严谨&…

DeePhage:预测噬菌体的生活方式

GitHub - shufangwu/DeePhage: A tool for distinguish temperate phage-derived and virulent phage-derived sequence in metavirome data using deep learning 安装 conda create -n deephage conda activate deephage pip install numpy pip install h5py pip install ten…

Spring Security入门教程:利用Spring Security实现安全控制

在现今这个数码大展拳脚的时代&#xff0c;安全问题无疑是咱们这些搞软件开发的人需要谨慎应对的一块烫手山芋&#xff0c;无论是那些大型企业应用&#xff0c;还是那种小打小闹的个人项目&#xff0c;对我们宝贵的数据和服务的保护都显得尤为关键。 试想一下&#xff0c;若是…

Java代码基础算法练习-求数据序列的最大值及最小值---2024.3.15

题目 任务描述&#xff1a;输入n个整数&#xff0c;求n个整数的最大值及最小值&#xff0c;并输出相应的位置序号。&#xff08;注&#xff1a;n<10&#xff0c; 位置序号从1开始计算&#xff0c;若存在多个相同值的情形&#xff0c;则输出第1个值的序号&#xff09; 任务要…

深度学习训练结果记录---日志文件写入logger 【简洁明了】

目录 介绍举例1.引入头文件2.封装函数3.在程序入口调用4. 记录训练过程 介绍 在进行深度学习模型训练的过程中&#xff0c;一般会设置log日志&#xff0c;将训练过程的中间结果以及最终结果写入&#xff0c;方便再次打开的时候进行查看。 logging的一些函数这里就不作介绍&…

【Realsense】解决Ubuntu 20.04安装Realsense SDK后realsense-ros报错的问题

最近在Ubuntu 20.04上安装了Realsense SDK&#xff08;版本为2.54.2&#xff09;&#xff0c;但在尝试编译安装realsense-ros&#xff0c;按照Intel官方安装教程执行catkin_clean&#xff08;或者catkin_make&#xff09;&#xff0c;遇到了如下报错&#xff1a; CMake Error …

PTA题解 --- 求整数段和(C语言)

今天是PTA题库解法讲解的第二天&#xff0c;接下来讲解求整数段和&#xff0c;题目如下&#xff1a; 为了解决这个问题&#xff0c;你可以遵循以下的思路&#xff1a; 1. 读取输入的两个整数A和B。 2. 使用一个for循环&#xff0c;从A遍历到B。 3. 在循环中&#xff0c;打印当…

试卷上的水印如何去除?分享3种常用的方法!

在日常生活和工作中&#xff0c;我们经常会遇到一些带有水印的试卷或文档&#xff0c;这些水印不仅影响了我们的阅读体验&#xff0c;还可能对我们的工作和学习产生一定的困扰。那么&#xff0c;如何有效去除试卷上的水印呢&#xff1f;今天&#xff0c;就让我们一起来探讨这个…

渗透测试实战思路分析

免责声明&#xff1a;文章来源真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人…

【LeetCode周赛】第388场周赛

目录 100233. 重新分装苹果 简单100247. 幸福值最大化的选择方案 中等100251. 数组中的最短非公共子字符串 中等100216. K 个不相交子数组的最大能量值 困难 100233. 重新分装苹果 简单 100233. 重新分装苹果 分析&#xff1a; 排序贪心 代码&#xff1a; class Solution {…

Liunx下安装Redis(详细安装)

1、创建一个文件目录 mkdir /opt/redis2、进入安装目录 cd /opt/redis3、下载redis默认安装包 默认是3.0版本的 wget http://download.redis.io/releases/redis4、进行解压 tar -xzvf redis-3.0.7.tar.gz5、进入解压好的文件夹目录 cd redis-3.0.7 6、将redis重新安装到 …

【C++】每日一题 82 删除排序链表中的重复元素

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 class ListNode { public:int val;ListNode* next;ListNode(int _val) {val _val;next nullptr;} };ListNode* deleteDuplicates(ListNo…

Python面向对象构造函数:手把手教你如何玩转对象初始化

我们都知道&#xff0c;Python是一个面向对象的语言&#xff0c;这意味着我们可以用类来定义对象的属性和方法。而构造函数&#xff0c;就是当我们创建一个新的对象时&#xff0c;会自动调用的特殊方法。那么&#xff0c;如何玩转这个构造函数呢&#xff1f; 首先&#xff0c;…

第七十八周周报

学习目标&#xff1a; 一、实验 学习时间&#xff1a; 2024.3.9-2024.3.15 学习产出&#xff1a; 实验 目前stylegna2、diffusion-stylegan2、U-ViT的实验以及ViTGAN cifar10的定性试验已经完成&#xff0c;还剩CelebA64的定性实验&#xff0c;以及DiT的实验。DiT模型改完…

蓝桥集训之大臣的旅费

蓝桥集训之大臣的旅费 核心思想&#xff1a;dfs求树的直径 从原点开始 找距离其最远的点 然后再找一次最远点 之间距离为直径2次dfs即可求出最长距离 #include<bits/stdc.h>using namespace std;const int N 1e610; int n ;int cnt[N] , e[N] , ne[N] , h[N] , idx ;i…

[Java、Android面试]_04_进程、线程、协程

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可收藏 文…