学习动态规划解决不同路径、最小路径和、打家劫舍、打家劫舍iii

学习动态规划|不同路径、最小路径和、打家劫舍、打家劫舍iii

62 不同路径

在这里插入图片描述

  • 动态规划,dp[i][j]表示从左上角到(i,j)的路径数量
  • dp[i][j] = dp[i-1][j] + dp[i][j-1]

在这里插入图片描述

在这里插入图片描述

import java.util.Arrays;/*** 路径数量* 动态规划,dp[i][j]表示从左上角到(i,j)的路径数量* dp[i][j] = dp[i-1][j] + dp[i][j-1]*/
public class $62 {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//边界for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int i = 0; i < n; i++) {dp[0][i] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];}public int uniquePaths2(int m, int n) {int[] dp = new int[n];Arrays.fill(dp, 1);for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[j] += dp[j-1];}}return dp[n-1];}
}
import java.util.Arrays;/*** 路径数量* 动态规划,dp[i][j]表示从左上角到(i,j)的路径数量* dp[i][j] = dp[i-1][j] + dp[i][j-1]*/
public class $62 {public int uniquePaths2(int m, int n) {int[] dp = new int[n];Arrays.fill(dp, 1);for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[j] += dp[j-1];}}return dp[n-1];}
}

64 最小路径和

在这里插入图片描述

  • 动态规划,dp[i][j]表示从左上角到(i,j)的最小路径和
  • grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j]

在这里插入图片描述

/*** 最小路径和* grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j]*/
public class $64 {public int minPathSum(int[][] grid) {for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (i==0 && j==0) continue;else if (i!=0 && j==0) grid[i][j] = grid[i-1][j] + grid[i][j];else if (i==0 && j!=0) grid[i][j] = grid[i][j-1] + grid[i][j];else grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j];}}return grid[grid.length-1][grid[0].length-1];}
}

198 打家劫舍

在这里插入图片描述

  • 动态规划,nums[i]表示前i间房屋能偷窃到的最高总金额
  • nums[i] = Math.max(nums[i-1], nums[i-2]+nums[i]);

在这里插入图片描述

/*** 打家劫舍* 动态规划,nums[i]表示前i间房屋能偷窃到的最高总金额* nums[i] = Math.max(nums[i-1], nums[i-2]+nums[i]);*/
public class $198 {public int rob(int[] nums) {//注意特殊值0,1if (nums == null || nums.length == 0) {return 0;}if (nums.length == 1) {return nums[0];}//nums[1]为nums[0]、nums[1]的最大值nums[1] = Math.max(nums[0], nums[1]);//从nums[2]开始for (int i = 2; i < nums.length; i++) {nums[i] = Math.max(nums[i-1], nums[i-2]+nums[i]);}return nums[nums.length-1];}
}

337 打家劫舍iii

在这里插入图片描述

  • 树形动态规划
  • 我们可以用 f(o)表示选择 o节点的情况下,o节点的子树上被选择的节点的最大权值和;
  • g(o)表示不选择 o节点的情况下,o节点的子树上被选择的节点的最大权值和;
  • l 和 r代表 o 的左右孩子。
  • 当 o 被选中时:o 的左右孩子都不能被选中,
  •  故 o 被选中情况下子树上被选中点的最大权值和为 l和 r不被选中的最大权值和 + o的值
    
  •  f(o)=g(l)+g(r)+o.val
    
  • 当 o不被选中时,o的左右孩子可以被选中,也可以不被选中。
  •  对于 o的某个具体的孩子 x,它对 o 的贡献是 x被选中和不被选中情况下权值和的较大值。
    
  •  g(o)=max{f(l),g(l)} + max{f(r),g(r)}
    

在这里插入图片描述

import java.util.HashMap;
import java.util.Map;/*** 打家劫舍iii* 树形动态规划* 我们可以用 f(o)表示选择 o节点的情况下,o节点的子树上被选择的节点的最大权值和;* g(o)表示不选择 o节点的情况下,o节点的子树上被选择的节点的最大权值和;* l 和 r代表 o 的左右孩子。** 当 o 被选中时:o 的左右孩子都不能被选中,*      故 o 被选中情况下子树上被选中点的最大权值和为 l和 r不被选中的最大权值和 + o的值*      f(o)=g(l)+g(r)+o.val* 当 o不被选中时,o的左右孩子可以被选中,也可以不被选中。*      对于 o的某个具体的孩子 x,它对 o 的贡献是 x被选中和不被选中情况下权值和的较大值。*      g(o)=max{f(l),g(l)} + max{f(r),g(r)}*/
public class $337 {Map<TreeNode, Integer> f = new HashMap<>();Map<TreeNode, Integer> g = new HashMap<>();public int rob(TreeNode root) {process(root);return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0));}private void process(TreeNode root) {if (root == null) {return;}process(root.left);process(root.right);f.put(root, root.val + g.getOrDefault(root.left, 0) + g.getOrDefault(root.right, 0));g.put(root, Math.max(f.getOrDefault(root.left, 0), g.getOrDefault(root.left, 0))+ Math.max(f.getOrDefault(root.right, 0), g.getOrDefault(root.right, 0)));}//法一的简化版public int rob2(TreeNode root) {int[] rootStatus = process2(root);return Math.max(rootStatus[0], rootStatus[1]);}private int[] process2(TreeNode root) {if (root == null) {return new int[]{0, 0};}int[] l = process2(root.left);int[] r = process2(root.right);int selected = root.val + l[1] + r[1];int notSelected = Math.max(l[0], l[1]) + Math.max(r[0], r[1]);return new int[]{selected, notSelected};}
}

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

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

相关文章

归并算法排序

目录 归并排序 逆序对的数量 归并排序 题目如下&#xff1a; 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式&#xff1a; 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&…

基于Java SSM框架实现智能仓储管理系统项目【项目源码+论文说明】

基于java的SSM框架实现仓库管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;智能仓储系统当然也不能排除在外。智能仓储系统是以实际运用为开发背景&#xf…

ThinkPad产品如何升级BIOS程序

操作步骤: 重要提示&#xff1a; 更新BIOS存在风险&#xff01;如果您的电脑在此过程中出现死机&#xff0c;系统崩溃或断电&#xff0c;则BIOS或UEFI固件程序可能会损坏&#xff0c;这将使您的电脑无法启动。 由于BIOS的版本或者在升级过程中出错&#xff0c;可能会造成不可…

移动客服系统必备功能:提升用户体验与工作效率的关键要素

在快速发展的时代&#xff0c;工作的节奏也越来越快&#xff0c;也许您正在高铁上或者正在午餐时&#xff0c;就有客户提出需求来。所以&#xff0c;移动客服系统的需求也越来越多&#xff0c;那么移动客服系统怎么样&#xff1f;接下来&#xff0c;我们一起来看看移动客服系统…

python-39-flask+nginx+Gunicorn的组合应用

flask nginx Gunicorn 王炸 1 flasknginxgunicornsupervisor 1.1 myapp.py from flask import Flask app Flask(__name__)app.route("/") def test_link():return "the link is very good"if __name__"__main__":app.run()默认是5000端口…

CSS去掉按钮阴影 | css去掉按钮边框 | 注意改变搜索的关键词、搜索方式

上图是在谷歌浏览器中运行的结果 button {box-shadow: none;height: 50px;width: 100px;background-color: white;border-color: white; }写了以上的css&#xff0c;发现按钮还是有阴影一样的东西&#xff0c;查阅网络资料的时候也一直在搜索“如何去掉按钮阴影”&#xff0c;…

Linux调试工具—gdb

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;HEART BEAT—YOASOBI 2:20━━━━━━️&#x1f49f;──────── 5:35 &#x1f504; ◀️ ⏸ ▶️ ☰ …

【Delphi】IOS上架踩坑记 - 2024年第一天

目录 一、前言&#xff1a; 二、IOS程序上架网址 三、踩坑记 1. 关于版本中的 CFBundleIdentifier 参数&#xff08;Transporter 提示&#xff09; 2. IOS APP 程序图标要求&#xff08;Transporter 提示&#xff09; 3. 关于版本中的 CFBundleShortVersionString 参数&a…

收入支出记录,对需要的账目明细进行颜色标记

面对繁杂的账单和财务数据&#xff0c;你是否曾为记账而感到苦恼&#xff1f;别担心&#xff0c;我们为你带来了一款全新的记账软件——晨曦记账本&#xff0c;这不仅仅是一个简单的记账工具&#xff0c;更是你财务管理的得力助手。 所需工具&#xff1a; 一个【晨曦记账本】…

【C++】Windows编译FileZilla Client

按照Compiling FileZilla 3 under Windows - FileZilla Wiki (filezilla-project.org)操作即可。 1.下载安装MSYS2 msys2-x86_64-20220118.exe 2.更新MSYS2 进入MSYS2 MinGW 64-bit shell&#xff0c;运行 pacman -Syu重复退出shell&#xff0c;更新MSYS2。直到没有可更新…

java servlet软件缺陷库管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet软件缺陷库管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean&#xff08;mvc模式)&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOM…

docker小白第十天

redis集群主从容错切换案例 3主3从的redis集群&#xff0c;某个主机宕机了&#xff0c;需要对应的从机补位。 docker exec -it redis-node-1 /bin/bash # 进入容器1的命令行 redis-cli -p 6381 # 进入节点1的命令行 cluster nodes # 查看集群信息可以看到1号和6号对应是主从关…

基于Java SSM框架实现房屋租赁合同系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现房屋租赁合同系统演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对房屋租赁系统越来越重视&#xff0c;更好的…

C++/CLI——2类和对象生存期

C/CLI——2函数与类的使用方法 函数使用 定义函数和使用函数基本与C#相同&#xff0c;只不过C/CLI可以像标准C一样&#xff0c;可以先声明函数原型&#xff0c;再定义函数主体。值得注意的是&#xff0c;如果有默认参数&#xff0c;只能在函数原型中定义&#xff0c;不能在函…

桉木芯建筑模板与其他材质比较有何不同?

在建筑行业中&#xff0c;模板的选择对于确保工程质量和效率至关重要。桉木芯建筑模板作为市场上的一种选择&#xff0c;与其他材质的模板相比&#xff0c;具有独特的优势。能强优品木业作为专业的桉木芯建筑模板生产厂家&#xff0c;其产品充分展示了这一材质的优越性能。 材质…

计算机组成原理复习5

总线结构与控制 文章目录 总线结构与控制总线结构单总线结构双总线结构三总线结构四总线结构 总线控制判优控制&#xff08;仲裁逻辑&#xff09;链式查询方式计数器定时查询独立请求方式 通信控制同步通信异步通信两种传输率的异步串行传送字符格式 总线结构 单总线结构 单总…

亿级流量场景下如何优化混合回收

大白话&#xff1a; 我们完全可以通过最大停顿时间的调整&#xff0c;来控制每次垃圾回收的region数量以及回收垃圾大小。 大白话&#xff1a; 1.是已分配内存占总内存的超过45%阈值&#xff1b; 2.优化G1垃圾回收关键的一点&#xff0c;设置合理的最大停顿时间。 大白话&#…

打破数据孤岛:ChatGPT如何打通金融大数据的任督二脉?

文章目录 一、引言二、ChatGPT与金融大数据分析的融合三、实践应用&#xff1a;ChatGPT在金融大数据分析中的优势与挑战四、案例分析&#xff1a;ChatGPT在金融大数据分析中的应用案例五、前景展望&#xff1a;ChatGPT在金融大数据分析领域的未来发展《AI时代Python金融大数据分…

数据仓库-数仓优化小厂实践

一、背景 由于公司规模较小&#xff0c;大数据相关没有实现平台化&#xff0c;相关的架构都是原生的Apache组件&#xff0c;所以集群的维护和优化都需要人工的参与。根据自己的实践整理一些数仓相关的优化。 二、优化 1、简易架构图 2、ODS层优化 2.1 分段式解析 随着业务增长…

多边形的填充算法的分析

多边形的填充 分析 思路一 我们之前已经实现了对直线的扫描转换&#xff0c;但是现在我们遇到了新的问题那就是如何对多边形进行填充&#xff0c;如图所示&#xff0c;如何对图示的多边形进行填充呢&#xff1f; 我所想到的第一个办法是这样的&#xff0c;那就是假设上顶点…