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

代码随想录算法训练营第36期DAY50

DAY50

如果写累了就去写套磁信吧。

198打家劫舍

  1. class Solution {
  2. public:
  3.     int rob(vector<int>& nums) {
  4.         vector<intdp(nums.size());
  5.         dp[0]=nums[0];
  6.         if(nums.size()==1return nums[0];
  7.         dp[1]=max(nums[0],nums[1]);
  8.         for(int i=2;i<nums.size();i++){
  9.             dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
  10.         }
  11.         return dp[nums.size()-1];
  12.     }
  13. };

213打家劫舍ii

数组成环,分三种情况:

  1. 不考虑首尾
  2. 不考虑首,仅考虑尾
  3. 不考虑尾,仅考虑首

注意,考虑不代表必选。

那么情况2 3 就已经包括了情况1。

写函数来解决,就不用挪数组。

注意是从dp[start]开始赋值

  1. class Solution {
  2. public:
  3.     int getres(vector<int>nums,int start,int end){
  4.         vector<intdp(nums.size());
  5.         if(start==end) return nums[start];
  6.         dp[start]=nums[start];
  7.         dp[start+1]=max(nums[start],nums[start+1]);
  8.         //注意i的初值
  9.         for(int i=start+2;i<=end;i++)
  10.         dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
  11.         return dp[end];
  12.     }
  13.     int rob(vector<int>& nums) {
  14.         if(nums.size()==1return nums[0];
  15.         int res1=getres(nums,0,nums.size()-2);
  16.         int res2=getres(nums,1,nums.size()-1);
  17.         if(res1>res2) return res1;
  18.         else return res2;
  19.     }
  20. };

337打家劫舍 iii--树形DP

能想到:后序遍历,把孩子信息传到父节点:若孩子之和没有大于父节点,则买入父节点。反之买入孩子之和。还要注意一些复杂的逻辑。还是不会。

节点之间的状态影响进一步计算,那么是动态规划

状态dp表示抢或不抢,抢的话,就不能动两个孩子;不抢的话,就要考虑动孩子了。

  1. 暴力递归

超时了:

  1. /**
  2.  * Definition for a binary tree node.
  3.  * struct TreeNode {
  4.  *     int val;
  5.  *     TreeNode *left;
  6.  *     TreeNode *right;
  7.  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8.  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9.  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10.  * };
  11.  */
  12. class Solution {
  13. public:
  14. //这个递归还挺难想
  15.     int rob(TreeNode* root) {
  16.         if(root==nullptr) return 0;
  17.         if(root->left==nullptr&&root->right==nullptr) return root->val;
  18.         int val1=root->val;
  19.         if(root->left) val1+=rob(root->left->left)+rob(root->left->right);
  20.         if(root->right) val1+=rob(root->right->left)+rob(root->right->right);
  21.         int val2=rob(root->left)+rob(root->right);
  22.         return max(val1,val2);
  23.     }
  24. };

  1. 动态规划

记录当前偷与不偷得到的最大金额。

树形DP,在树上做状态转移。

求一个节点,偷与不偷两个状态分别所得到的金钱,返回值是一个长度为2的数组。

  1. /**
  2.  * Definition for a binary tree node.
  3.  * struct TreeNode {
  4.  *     int val;
  5.  *     TreeNode *left;
  6.  *     TreeNode *right;
  7.  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8.  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9.  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10.  * };
  11.  */
  12. class Solution {
  13. public:
  14.     vector<intgetres(TreeNode* cur){
  15.         if(cur==nullptrreturn {0,0};
  16.         vector<int> left=getres(cur->left);
  17.         vector<int> right=getres(cur->right);
  18.         int val1=cur->val+left[0]+right[0];
  19.         int val2=max(left[0],left[1])+max(right[0],right[1]);
  20.         return {val2,val1};
  21.     }
  22.     int rob(TreeNode* root) {
  23.         vector<int> res=getres(root);
  24.         return max(res[0],res[1]);
  25.     }
  26. };

相关文章:

  • Docker 进入指定容器内部(以Mysql为例)
  • 详解linux设备下的/dev/null
  • 微信小程序怎么进行页面传参
  • 大学数字媒体艺术设计网页设计试题及答案,分享几个实用搜题和学习工具 #媒体#职场发展
  • 12寸晶圆厂建设概述
  • Javascript全解(基础篇)
  • C语言详解(动态内存管理)2
  • Nvidia Jetson/Orin/算能 +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶
  • idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法
  • go语言实战--基于Vue3+gin框架的实战Cetide网项目(讲解开发过程中的各种踩坑)
  • Unity学习要点
  • 【线性代数】第一章 概率论的基本概念
  • 关于使用南墙waf防护halo网站主页请求404报错的解决方案
  • 如何把linux安装到单片机中
  • git 空仓库笔记
  • JavaScript-如何实现克隆(clone)函数
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【知识碎片】第三方登录弹窗效果
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Facebook AccountKit 接入的坑点
  • golang中接口赋值与方法集
  • Java 内存分配及垃圾回收机制初探
  • Java基本数据类型之Number
  • LeetCode算法系列_0891_子序列宽度之和
  • Mithril.js 入门介绍
  • php的插入排序,通过双层for循环
  • Sass 快速入门教程
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 给github项目添加CI badge
  • 关于Flux,Vuex,Redux的思考
  • 关于使用markdown的方法(引自CSDN教程)
  • 微服务框架lagom
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​secrets --- 生成管理密码的安全随机数​
  • ​一些不规范的GTID使用场景
  • (1)(1.13) SiK无线电高级配置(五)
  • (2.2w字)前端单元测试之Jest详解篇
  • (k8s中)docker netty OOM问题记录
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)linux文件内容查看
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)程序员技术练级攻略
  • .apk 成为历史!
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net 6.0 Windows平台如何判断当前电脑是否联网