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

代码随想录算法训练营第四十八天 _ 动态规划_198.打家劫舍、213.打家劫舍II、337.打家劫舍 III。

学习目标:

动态规划五部曲:
① 确定dp[i]的含义
② 求递推公式
③ dp数组如何初始化
④ 确定遍历顺序
⑤ 打印递归数组 ---- 调试
引用自代码随想录!

60天训练营打卡计划!

学习内容:

198.打家劫舍

  • 动态规划五步曲:
    ① 确定dp[i]的含义 : 包含 下标i 偷得最大的金币数。
    ② 求递推公式 : dp[i] = max(dp[i-2] + nums[i] , dp[i-1])
    偷 i:dp[i-2] + nums[i]
    不偷 i:dp[i-1]
    ③ dp数组如何初始化 : dp[0] = nums[0] dp[1] = max(nums[0], nums[1])
    ④ 确定遍历顺序 : 从前向后
// 动态规划
class Solution {public int rob(int[] nums) {int size = nums.length;int[] dp = new int[size];// 初始化dp[0] = nums[0];if(size > 1)dp[1] = Math.max(nums[0], nums[1]);// 递归逻辑for(int i = 2; i < size; i++){dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);}return dp[size-1];}
}

213.打家劫舍II

  • 给定的数组连城环啦。
  • 动态规划五步曲:
    ① 确定dp[i]的含义 :包含 下标i 偷得最大的金币数。
    ② 求递推公式 : dp[i] = max(dp[i-2] + nums[i] , dp[i-1])
    偷 i:dp[i-2] + nums[i]
    不偷 i:dp[i-1]
    ③ dp数组如何初始化 : dp[start] = nums[start]
    dp[start+1] = Math.max(nums[start],nums[start+1])
    ④ 确定遍历顺序 : 从前向后
class Solution {public int robAsist(int[] nums, int start, int end) {// 包含 物品i 在内的最大的金币数。int[] dp = new int[end];// 初始化dp[start] = nums[start];dp[start+1] = Math.max(nums[start],nums[start+1]);// 递归逻辑for(int j = start+2; j < end; j++){dp[j] = Math.max(dp[j-1], dp[j-2]+nums[j]);}return dp[end-1];}public int rob(int[] nums) {if(nums.length == 1)   return nums[0];if(nums.length == 2)   return nums[0] > nums[1] ? nums[0] : nums[1];int len = nums.length;//  因为是环,有两种情况// 一、不选择头节点,这样就可以选尾节点// 二。不选择尾节点,这样就可以选头节点// 且规则是左闭右开return Math.max(robAsist(nums, 0, len - 1), robAsist(nums, 1, len));}
}

337.打家劫舍 III

  • 树形的数据结构。(后序遍历 – 左右中)
  • 递归三部曲:
    递归函数的传入参数和返回值;
    递归函数的结束条件;
    递归函数的最小逻辑。
  • 动态规划五步曲:
    ① 确定dp[i]的含义 : dp[0] : 不偷当前节点的最大金币数 dp[1]:偷当前节点的最大金币数
    ② 求递推公式 : 递归传给上一层
    偷根节点: dp[1] = node.val + leftdp[0] + rightdp[0]
    不偷根节点: dp[0] = max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1])
    ③ dp数组如何初始化 : dp[0] = 0 dp[1] = 0
    ④ 确定遍历顺序 : 从叶子节点到根节点
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 递归函数的返回值是一维数组。public int[] robTree(TreeNode node) {// 递归函数的结束条件if(node == null) return new int[]{0,0};// 递归函数的最小逻辑int[] leftdp = robTree(node.left);int[] rightdp = robTree(node.right);// 不偷根节点int val1 = Math.max(leftdp[0], leftdp[1]) + Math.max(rightdp[0], rightdp[1]);// 偷根节点int val2 = node.val + leftdp[0] + rightdp[0];return new int[]{val1, val2};}public int rob(TreeNode root) {int[] dp = robTree(root);return dp[0] > dp[1] ? dp[0] : dp[1];}
}

学习时间:

  • 上午两个半小时,整理文档半小时。
http://www.lryc.cn/news/257860.html

相关文章:

  • 记录一下快速上手Springboot登录注册项目
  • 【LVGL】STM32F429IGT6(在野火官网的LCD例程上)移植LVGL官方的例程(还没写完,有问题 排查中)
  • Vue学习笔记-Vue3中ref和reactive函数的使用
  • 大数据分析与应用实验任务十一
  • “78Win-Vận mệnh tốt”Trang web hỗ trợ kỹ thuật
  • React中使用react-json-view展示JSON数据
  • 一文简述“低代码开发平台”到底是什么?
  • HNU计算机体系结构-实验3:多cache一致性算法
  • Go语言学习路线规划
  • 微软NativeApi-NtQuerySystemInformation
  • 灵活与高效的结合,CodeMeter Cloud Lite轻云锁解决方案
  • Flink 系列文章汇总索引
  • 计算机网络——期末考试复习资料
  • 【数据结构】面试OJ题——链表
  • flask web开发学习之初识flask(三)
  • 【设计模式-3.1】结构型——外观模式
  • flutter学习-day2-认识flutter
  • 解决selenium使用.get()报错:unknown error: unsupported protocol
  • 关于加密解密,加签验签那些事
  • 容器重启后,Conda文件完整保存(虚拟环境、库包),如何重新安装conda并迁移之前的虚拟环境
  • gitee对接使用
  • C语言中的一维数组与二维数组
  • 【Linux】地址空间
  • 作为一个产品经理带你了解Axure的安装和基本使用
  • 接口测试总结及其用例设计方法
  • 2023团体程序设计天梯赛——模拟赛和总决赛题
  • 智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 视频中自监督学习:「我的世界」下指令理解与跟随
  • Spring基于xml半注解开发
  • 功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?