动态规划先导片

大家知道动规是由前一个状态推导出来的,而贪心是局部直接选最优的,对于刷题来说就够用了。

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

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

part 02

不同路径

63. 不同路径 II - 力扣(LeetCode)

在这里插入图片描述

//初始化(优化)for(int j=1;j<=n && obstacleGrid[0][j-1]==0;j++){dp[1][j]=1;}for(int i=1;i<=m && obstacleGrid[i-1][0]==0 ;i++){dp[i][1]=1;}

part 03

343. 整数拆分 - 力扣(LeetCode)

  1. dp[i] 拆分数字i,得到最大乘积dp[i]
  2. 递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});
    也可以这么理解,j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。
    那么在取最大值的时候,为什么还要比较dp[i]呢?
    因为在递推公式推导的过程中,为了每次计算更新dp[i]
  3. 初始化 dp[2]=1
  4. 确定遍历顺序
    dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。
 public int integerBreak(int n) {int[] dp = new int[n+1];dp[2]=1;for(int i=3;i<=n;i++){for(int j=1;j<=i-1;j++){dp[i]=Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]));}}return dp[n];}

96. 不同的二叉搜索树 - 力扣(LeetCode)

当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,是不是和 n 为2的时候两棵树的布局是一样的啊!

(可能有同学问了,这布局不一样啊,节点数值都不一样。别忘了我们就是求不同树的数量,并不用把搜索树都列出来,所以不用关心其具体数值的差异)

当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!

当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!

发现到这里,其实我们就找到了重叠子问题了,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。

思考到这里,这道题目就有眉目了。

part04

背包问题

0 1背包

求容量为j的背包,最多能装多少(二维数组)

能不能放

  1. 不能
    取上一个值

  2. 取放和不放的最大值
import java.util.ArrayList;
import java.util.Scanner;public class Main {public static void main(String[] args) {int m;int n;Scanner sc=new Scanner(System.in);m=sc.nextInt();//材料种类n=sc.nextInt();//行李空间int[] weight=new int[m];int[] value=new int[m];for (int i = 0; i < m; i++) {weight[i]=sc.nextInt();}for (int i = 0; i < m; i++) {value[i]=sc.nextInt();}//dp[i][j] i表示第i种材料,j表示行李容量,dp[i][j]表示前i种材料放入j空间的最大价值int[][] dp=new int[m][n+1];//递推公式 取放i材料,与不放i材料的value最大值   dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])//初始化  由递推公式可知,每一个值由左上方的值推导而来.因此初始化第一行第一列for(int j=weight[0];j<=n;j++){dp[0][j]=value[0];}//遍历顺序 从前往后for(int i=1;i<m;i++){for(int j=1;j<=n;j++){if (j < weight[i]) {/*** 当前背包的容量都没有当前物品i大的时候,是不放物品i的* 那么前i-1个物品能放下的最大价值就是当前情况的最大价值*/dp[i][j] = dp[i-1][j];} else {/*** 当前背包的容量可以放下物品i* 那么此时分两种情况:*    1、不放物品i*    2、放物品i* 比较这两种情况下,哪种背包中物品的最大价值最大*/dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]);}}}System.out.println(dp[m-1][n]);}}

416. 分割等和子集 - 力扣(LeetCode)
分成两个,背包大小为sum/2

part 05

1049. 最后一块石头的重量 II - 力扣(LeetCode)

本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了
return int

装满容量为x的背包,有几种方法

494. 目标和 - 力扣(LeetCode)

本题要如何使表达式结果为target,
正数集合和left-负数集合和right=target

left + right = sum,而sum是固定的。right = sum - left
公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2 。
target是固定的,sum是固定的,left就可以求出来。
此时问题就是在集合nums中找出和为left的组合。

此时问题就转化为,装满容量为x的背包,有几种方法n。
之前都是求容量为j的背包,最多能装多少。

return n

474. 一和零 - 力扣(LeetCode)

class Solution {public int findMaxForm(String[] strs, int m, int n) {// dp[i][j] i个0,j个1大的容器,最多装元素 dp[i][j]个//dp[i][j] = Math.max(dp[i][j],dp[i-x][j-y]+1);,x表示装strs[i] 中0的个数古,y表示strs[i] 中1的个数int zeroNums=0;int oneNums=0;int[][] dp=new int[m+1][n+1];for(String str:strs){zeroNums=0;oneNums=0;for(char ch: str.toCharArray()){if(ch == '0'){zeroNums++;}else{oneNums++;}}//倒序遍历for(int i=m;i>=zeroNums;i--){for(int j=n;j>=oneNums;j--){dp[i][j]=Math.max(dp[i][j],dp[i-zeroNums][j-oneNums]+1);}}}return dp[m][n];}}

没太搞懂

   //倒序遍历for(int i=m;i>=zeroNums;i--){for(int j=n;j>=oneNums;j--){dp[i][j]=Math.max(dp[i][j],dp[i-zeroNums][j-oneNums]+1);}}

在这里插入图片描述

未完待续

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

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

相关文章

linux造成只读模式的原因和解决方法

造成硬盘分区只读的可能原因有: 文件系统错误,内核相关硬件驱动bug,FW固件类问题,磁盘坏道 硬盘背板故障,硬盘线缆故障,HBA卡故障,RAID卡故障,随意开关机系统损坏 使用用 fsck – y /dev/sda (/dev/sda指你需要修复的分区) 来修复文件系统 mount -t vfat /dev/sda1…

开源!工厂数字化项目会用到的地理信息系统

软件介绍 QGIS&#xff08;Quantum GIS&#xff09;是一款免费、开源、跨平台的地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;适用于Unix平台、Windows和MacOS。提供了强大且用户友好的功能&#xff0c;使其成为地理信息处理领域的热门选择。 功能特点 1.空间数据管…

react使用npm i @reduxjs/toolkit react-redux

npm i reduxjs/toolkit react-redux 创建一个 store文件夹&#xff0c;里面创建index.js文件和子模块文件夹 index,js文件写入以下代码 import {configureStore} from reduxjs/toolkit // 导入子模块 import counterReducer from ./modules/one import two from ./modules/tw…

鸿蒙TypeScript学习第14天:【联合类型】

1、TypeScript 联合类型 联合类型&#xff08;Union Types&#xff09;可以通过管道(|)将变量设置多种类型&#xff0c;赋值时可以根据设置的类型来赋值。 注意&#xff1a;只能赋值指定的类型&#xff0c;如果赋值其它类型就会报错。 创建联合类型的语法格式如下&#xff1…

【项目精讲】Spring框架中如何使用Redis+代码实现(2)利用Spring Cache框架

Spring Cache框架 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; EHCacheCaffeineRedi…

RTSP/Onvif安防视频EasyNVR平台 vs.多协议接入视频汇聚EasyCVR平台:设备分组的区别

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

大厂Java笔试题之判断字母大小写

/*** 题目&#xff1a;如果一个由字母组成的字符串&#xff0c;首字母是大写&#xff0c;那么就统计该字符串中大写字母的数量&#xff0c;并输出该字符串中所有的大写字母。否则&#xff0c;就输出* 该字符串不是首字母大写*/ public class Demo2 {public static void main(St…

Redis的双写一致性问题

双写一致性问题 1.先删除缓存或者先删除数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

在视频号开店,新手一定要注意了,这几个细节很多人都不知道

大家好&#xff0c;我是电商笨笨熊 视频号小店作为今年黑马项目&#xff0c;自是吸引力不少的电商玩家&#xff1b; 但是在这些玩家中不免有一些新手玩家&#xff0c;从未做过电商&#xff0c;或者做过其他平台的电商但是没有接触过视频号&#xff1b; 而视频号小店在某些地…

最佳调度问题(c++题解)

题目描述 假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这 n个任务的最佳调度&#xff0c;使得完成全部任务的时间最早。 对任意给定的整数n和k&#xff0c;以及完成任务i需要的时间为ti&#xff0c;i1~n。编程计算完成这n个任务…

thinkphp6入门(23)-- 如何导入excel

1. 安装phpexcel composer require phpoffice/phpexcel composer update 2. 前端 <form class"forms-sample" action"../../xxxx/xxxx/do_import_users" method"post" enctype"multipart/form-data"><div class"cont…

【InternLM 实战营第二期-笔记4】XTuner 微调个人小助手认知

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) XTuner 微调个人小助手…

基于 FPGA 的 DE1-SoC 功率估算器

Introduction 功耗是当今许多技术都要考虑的重要因素。例如&#xff0c;手机生产商总是谈论他们在电源管理方面的改进&#xff0c;以及如何延长电池的使用寿命。功能与功耗之间的平衡是许多人都在研究的有趣课题。然而&#xff0c;当我们做实验时&#xff0c;我们很少会考虑我…

快速掌握定时任务处理

定时任务 在项目中存在一种操作&#xff0c;这个操作需要在未来的某一天开始执行&#xff0c;不需要人定时到时候再去写&#xff0c;而是提前写好定时进行执行 在java项目中提供有对应的API&#xff0c;下面就是java中原始的操作 public class shijian {public static void mai…

ytorch深度学习完整GPU图像分类代码

1. CPU与GPU不同 1.输入数据 2.网络模型 3.损失函数 .cuda() 说明&#xff1a;下面代码中GPU版本中取消下划线的即为CPU版本 2.完成的分类代码(GPU) import torch import torchvision from torch.utils.tensorboard import SummaryWriter# from model import * # 准备数据集 …

SpringBoot3整合Mybatis plus

Java版本&#xff1a;17 Spring Boot版本&#xff1a;3.1.10 Mybatis plus版本&#xff1a;3.5.5 源码地址&#xff1a;Gitee仓库 01 创建我们的项目工程 首先&#xff0c;我们创建一个maven工程spring-boot3-demo&#xff0c;pom文件配置如下。 这里我们将spring-boot-start…

【python】基于librosa库提取音频特征

一、源码 import librosa audio_path ./audio.mp3 audio, sr librosa.load(audio_path) # 提取音频信号的时域特征 amplitude librosa.amplitude_to_db(librosa.stft(audio), refnp.max) # 提取音频信号的频域特征 mfccs librosa.feature.mfcc(audio, srsr) # 提取音频信号…

视频号小店好做吗?普通人没有货源,也可以做吗?

大家好&#xff0c;我是电商糖果 视频号小店作为2022年才出来的电商黑马项目&#xff0c;吸引了不少正在找创业项目的朋友。 这里面也有很多没有接触过电商&#xff0c;没有货源的普通人。 于是不少朋友就问糖果&#xff0c;如果普通人没有货源可以做吗&#xff1f;小店好做…

JCYZ H3CNE-RS+

JCYZ H3CNE-RS 20240413 20240413 https://www.h3c.com/cn/ 支持–软件下载–其他产品–模拟器官方下载 人才研学中心—技术认证—电子资料 按范围划分&#xff1a;局域网 城域网 广域网 按拓扑结构划分&#xff1a;总线型 环型 星型 树型 全网状 部分网状&#xff08;优缺点&a…

简单好用的SaaS知识库工具都在这了,看完赶紧收藏!

在信息飞速发展的今天&#xff0c;企业如何有效地管理海量的信息和知识成为了提高工作效率的关键。SaaS知识库工具正成为企业寻求的解决方案&#xff0c;它们不仅能够帮助团队组织文档&#xff0c;而且优化知识分享流程。现在就让我们来看看市场上几款简单又好用的SaaS知识库工…