代码随想录训练营Day34:背包问题解决打家劫舍

ops/2024/9/23 10:29:27/

1.198打家劫舍

1.dp数组的含义:dp[i]表示从第零个偷到第i个能够偷到的最大价值。

2.递推公式:分成两种情况:

  1. 偷第i个的情况下的最大值,注意此时第i-1个肯定是不偷的,所以此时dp[i] = dp[i-2]+nums[i];=>dp[j] = dp[j-weight[i]]+value[i];
  2. 不偷第i个的情况下的最大值,需要注意的是此时第i-1个不一定偷,只是考虑第i-1个房间。所以此时为dp[i] = dp[i-1]

      最后取两者的最大值。

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n == 0)return 0;if(n == 1) return nums[0];//边界条件vector<int> dp(n);//偷到i房间的最大的价值dp[0] = nums[0];dp[1] = max(nums[0],nums[1]);for(int i = 2;i<n;i++){//偷第i个房间:第i-2最大值的最大值加上当前的值,不偷第i个房间:第i-1的最大值dp[i] = max(dp[i-2]+nums[i],dp[i-1]);}return dp[n-1];}
};

2.213打家劫舍二

本题相比于前面多了一个首尾相连的情况,为了解决这个问题,我们可以将其分成两个部分(第一个是不含最后一个,第二个是不含第一个),每个部分都按按照前面打家劫舍的方式来求解,求解出两种情况下打家劫舍的最大值之后,然后计算出最大值即可。

class Solution {
public:int rob(vector<int>& nums) {//分成两次,一次是含首不含尾,一次是含尾不含首,两次求出来的最大值再最后求一个最大值即为最终结果int n = nums.size();if(n==1) return nums[0];if(n==2) return max(nums[0],nums[1]);//vector<int> dp1(n-1);int dp10 =nums[0],dp11=max(nums[0],nums[1]),result1=dp11;int dp20 =nums[1],dp21=max(nums[1],nums[2]),result2=dp21;for(int i = 2;i<n-1;i++){result1 = max(dp10+nums[i],dp11);dp10 = dp11;dp11 = result1;result2 = max(dp20+nums[i+1],dp21);dp20 = dp21;dp21 = result2;}return max(result1,result2);/*dp1[0]=nums[0];cout<<dp1[0];dp1[1]=max(nums[0],nums[1]);for(int i = 2;i<n-1;i++){dp1[i]=max(dp1[i-2]+nums[i],dp1[i-1]);}vector<int> dp2(n-1);dp2[0]=nums[1];dp2[1]=max(nums[1],nums[2]);for(int i = 2;i<n-1;i++){dp2[i]=max(dp2[i-2]+nums[i+1],dp2[i-1]);}return max(dp1[n-2],dp2[n-2]);*/}
};

3.337打家劫舍三

思路:首先我们可以看出这是一个树形结构,对于这种树形结构要求出最大值,我们就需要先确定遍历顺序,先确定左右两个孩子是否偷,再确定父节点是否偷从而实现一个相对来说的最大值,所以遍历方式选择的是深度遍历。第二个需要确定的就是返回值:由于偷和不偷分为两种情况,所以返回值应该是一个数组,分别存放偷还是不偷的结果。第三个确定的是循环终止条件:当其孩子节点为空的时候,偷不偷都是0,此时返回return {0,0};第四个需要确定的是循环内的处理情况:分别是该节点偷的时候的最大值和该节点不偷的时候的最大值,将其作为返回数组返回。

/*** 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://[不偷,偷]这样的返回结果vector<int> TreerobMax(TreeNode* cur){if(cur == nullptr){return {0,0};}vector<int> left = TreerobMax(cur->left);vector<int> right = TreerobMax(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};}int rob(TreeNode* root) {vector<int> result = TreerobMax(root);return max(result[0],result[1]);}
};


http://www.ppmy.cn/ops/43888.html

相关文章

“盲人家庭生活技能训练计划”:编织自立自强的生活篇章

在温馨的家庭环境中&#xff0c;每位成员都渴望拥有独立自主的生活能力&#xff0c;对于盲人来说&#xff0c;这一点尤为重要。随着科技的进步&#xff0c;如“蝙蝠避障”这样创新的辅助软件正逐步进入大众视野&#xff0c;为盲人日常生活带来便利的同时&#xff0c;也启示我们…

「架构」微服务

微服务架构是一种软件开发架构,它将应用程序作为一组小的服务构建,每个服务实现特定的业务功能,并通过轻量级的通信机制(通常是HTTP RESTful API)进行交互。这些服务是松耦合的,可以独立部署、扩展和更新。 核心功能: 服务分解:将应用程序分解为一组小型、独立的服务。…

《Python源码剖析》之pyc文件

前言 前面我们主要围绕pyObject和pyTypeObject聊完了python的内建对象部分&#xff0c;现在我们将开启新的篇章—python虚拟机&#xff0c;将聚焦在python的执行部分&#xff0c;搞懂从“代码”到“执行”的过程。开启新的篇章之前&#xff0c;你也许会有一个疑惑&#xff1a;我…

B树与B+树区别

B树和B树是常见的数据库索引结构&#xff0c;都具有相较于二叉树层级较少&#xff0c;查找效率高的特点&#xff0c;它们之间有以下几个主要区别&#xff1a; 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据&#xff0c;指针和数据共同保存在同一节点中B树…

Python Flask生产环境部署-多线程启动

一、问题现象 开发平台的时候碰到了一个坑&#xff0c;前端某个页面加载时总是会概率性的出现某些请求加载失败&#xff0c;报错&#xff1a;network issue&#xff0c;导致首页部分内容渲染不完全。 浏览器Console界面可以看到页面报错信息如下&#xff1a; has been blocke…

看这两位东北圣女美吗?如何描写美女的大长腿?

看这两位东北圣女美吗&#xff1f;如何描写美女的大长腿&#xff1f; 最近署名为懂球娘娘的一篇描写东北圣女的文章火了&#xff0c;文中描述了海棠朵朵与辛芷蕾这两位娇媚动人的角色。其美艳动人的形象和魅力四溢的描写让人为之倾倒。 这种通过文字展现人物魅力的能力让人佩服…

兰博基尼STO 激活carplay ,定制刷写原厂证书

兰博基尼STO 激活carplay &#xff0c;定制刷写原厂证书

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…