首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode动态规划模板

Leetcode动态规划模板

作者头像
SL_World
发布于 2021-03-24 06:31:54
发布于 2021-03-24 06:31:54
68100
代码可运行
举报
文章被收录于专栏:XX
运行总次数:0
代码可运行

文章目录

0 前言

路径

基本要素

说明

核心基础

穷举法

需“聪明”穷举

存在问题

重叠子问题

有众多相同子问题(eg.多个f(18)),需记录

具备特点

最优子结构

原问题的解包含子问题的解

状态转移思维模式

自顶向下(推荐)

当前状态如何由前一个状态推出

目前所遇动态规划问题一般形式包括

形式

状态转移方程一般式(滚动数组)

初始化

遍历顺序

求最值

dpj = max(dpj, dp[j - weighti] + vali)

dp0 = 0

物品和背包可颠倒但先物品后容量耗时低

求组合数

dpj = dpj + dp[j - weighti]

dp0 = 1

先物品,后背包容量

求排列数

dpj = dpj + dp[j - weighti]

dp0 = 1

先背包容量,后物品

  • 这里为什么变动一下遍历顺序,就从求组合数变成求排列数了呢?因为先遍历物品后遍历背包容量,隐含了我在《Leetcode回溯法四板一解模板》中提到的对待组合问题的**first**索引技巧,不用它则求解为排列问题(不得不说动态规划和回溯法面对同类型题,特定领域技巧是相通的)详情可以点击了解.
  • 为什么在不要求遍历顺序的问题上,更推荐先遍历物品,再遍历背包容量呢?因为组合比排列有更少的搜索量!

背包集合

代码特点

原因

for外遍历顺序

0-1背包

背包容量for循环j--降序

不论容量多少最多装1次,避免累加

组合→先物品后背包 排列→先背包后物品

完全背包

背包容量for循环j++升序

容量越多最多可方便无限累加

组合→先物品后背包 排列→先背包后物品

1 解题思考模式

1.1 能不能用动态规划做?

由于面试解题没有时间进行数学验证,因此需要训练一些基本feeling,满足feeling即可果断尝试,十拿九稳!

  • if能穷举出所有解,回溯法能不能搜索出所有解if是, then回溯可得正确答案
  • 原问题是否包含多个相同子问题if是, then回溯可能会超时 (力扣:编辑距离)
  • 子问题的解是否相互独立?,最起码独立满足最优子结构性质 ——独立:总高考分 = 语文成绩 + 数学成绩 + …,其中语文成绩与数学成绩无关 ——相关:总高考分 = 语文成绩 + 数学成绩 + …,其中语文成绩与数学成绩成反比关系,导致无法同时最优
  • 满足以上条件可用动态规划做

1.2 怎么用动态规划做?(七步走)

顺序

思考步骤

解释/例子

1

有什么状态?

容量,累计和,金额等

2

有什么选择?

该物品装与不装,该数值是否累计,该硬币是否添加等

3

dpj数组含义是什么?

索引j表状态(eg.容量),返回值dpj是题目的解

4

如何定义状态转移?

任意状态由前状态经过怎样的选择转移达到(自顶向下)

5

如何初始化dp数组?

结合状态转移初始化,eg.max初始全0,求和dp0=1,有负数初始INT_MIN

6

for外遍历顺序?

求最值推荐先物品后背包,求组合先物品后背包,求排列先背包后物品

7

for内遍历顺序?

有状态压缩则背包容量for内降序,无状态压缩则升序

2 动态规划模板

2.1 通用模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用初始化
vector<int> dp(容量 + 1, base case1);
// 2.边界初始化
dp[0][0][...] = base case2
// 3.状态转移
for 状态1的个数
	for 状态2的个数
		for ...
			dp[状态1][状态2][...] = 求最值 or 求和(选择1, 选择2...)

2.2 背包模板

以下模板均以状态压缩后的滚动数组为例

2.2.1 01背包模板

每个物品有装1次,或不装两个选择

1 最值问题

状态转移方程:背包容量下的最值 = max(不装物品i最值, 装物品i的最值),最小反之

  • 物品价值全部非负
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, 0);
for (int i = 0; i < 物品总数; i++)
    for (int j = 背包容量; j >= 物品i的重量; j--) {
        // 3.背包容量下的最值 = max(不装物品i最值, 装物品i的最值)
        dp[j] = max(dp[j], dp[j - 物品i的重量] + 物品i的价值);
    }
return dp[背包容量];
  • 物品价值存在负数 (初始化INT_MININT_MAX + for内判断)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, INT_MIN);
// 2.边界dp初始化
dp[0] = 0; 
for (int i = 0; i < 物品总数; i++)
    for (int j = 背包容量; j >= 物品i的重量; j--) {
    	if (dp[i - 物品i的重量] == INT_MIN) continue;   // 因为不能有INT_MIN + 常数
        // 3.背包容量下的最值 = max(不装物品i最值, 装物品i的最值)
        dp[j] = max(dp[j], dp[j - 物品i的重量] + 物品i的价值);
    }
return dp[背包容量];

2 组合问题

  • 返回具体组合数

状态转移方程:总组合数 = 不装物品i的组合数 + 装物品i的组合数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, 0);
// 2.边界dp初始化
dp[0] = 1;    // [关键]:根据状态转移方程,dp[0]须为1
for (int i = 0; i < 物品总数; i++)
    for (int j = 背包容量; j >= 物品i的重量; j--) {
        // 3.总组合数 = 不装物品i的组合数 + 装物品i的组合数
        dp[j] = dp[j] + dp[j - 物品i的重量];
    }
return dp[背包容量];
  • 返回组合的存在还是不存在

状态转移方程:组合是否有 = 不装物品i的组合是否有 || 装物品i的组合是否有

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, false);
// 2.边界dp初始化
dp[0] = true;    // [关键]:根据状态转移方程,dp[0]须为true
for (int i = 0; i < 物品总数; i++)
    for (int j = 背包容量; j >= 物品i的重量; j--) {
        // 3.组合是否有 = 不装物品i的组合是否有 || 装物品i的组合是否有
        dp[j] = dp[j] || dp[j - 物品i的重量];
    }
return dp[背包容量];

3 排列问题

状态转移方程:总排列数 = 不装物品i的排列数 + 装物品i的排列数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, 0);
// 2.边界dp初始化
dp[0] = 1;    // [关键]:根据状态转移方程,dp[0]须为1
for (int j = 1; j <= 背包容量; j++) {
    for (int i = 0; i < 物品总数; i++)
        // 3.总组合数 = 不装物品i的排列数  + 装物品i的排列数 
        dp[j] = dp[j] + dp[j - 物品i的重量];
    }
return dp[背包容量];

2.2.2 完全背包模板

每个物品有装无限次,或不装两个选择

组合问题(背包容量for循环升序)

  • 返回具体组合数

状态转移方程:总组合数 = 不装物品i的组合数 + 装物品i的组合数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1.通用dp初始化
vector<int> dp(背包容量 + 1, 0);
// 2.边界dp初始化
dp[0] = 1;    // [关键]:根据状态转移方程,dp[0]须为1
for (int i = 0; i < 物品总数; i++)
	for (int j = 物品i的重量; j <= 背包容量; j++) {
        // 3.总组合数 = 不装物品i的组合数 + 装物品i的组合数
        dp[j] = dp[j] = dp[j] + dp[j - 物品i的重量]; 
    }
return dp[背包容量];

刷题还在继续,持续总结中~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
“不是 Cursor 不够强,是 Claude Code 太猛了” !创始人详解Claude Code如何改写编程方式
对于许多开发者来说,每月 20 美元的 Cursor 和 Copilot 已经是“无限量”好用的标配。然而,Anthropic 的 Claude Code 却是个异类。它在处理大型代码库方面表现相当出色,但价格却直接翻了几倍。如果你只是周末写写代码,几美元的 API key 兴许就够了;可一旦用于日常开发,每月账单轻松就能突破 50、100 甚至 200 美元。有用户直言不讳地指出:“Claude Code 的能力比 Cursor 更强。我还在用 Cursor 的唯一原因,就是 Claude Code 实在太贵了。”
深度学习与Python
2025/06/09
2.4K0
“不是 Cursor 不够强,是 Claude Code 太猛了” !创始人详解Claude Code如何改写编程方式
基因的功能推断之敲减过表达的干扰它
这些方法都需要大队列,因为如果样品数量太少了,很多统计学分析就不行。虽然我最推崇wgcna这样的共表达模块分析方法,但是这些基因的功能推断毕竟是间接的证据,如果是在多个大队列转录组表达量矩阵里面都拿到了同样的结果才能让人信服!
生信菜鸟团
2025/02/03
2130
基因的功能推断之敲减过表达的干扰它
如何利用conda管理python环境
conda包管理器可以创建,导出,列出,移除以及更新python环境,而且python环境可以使用不同版本的python,并且安装不同的安装包。在每一个环境之间进行切换称为激活环境。你也可以和别人共享环境文件。
bugsuse
2020/04/21
2K0
服务器自动保存tmux会话以及恢复tmux会话
最近服务器总是重启,导致实验中断,同时运行多个实验,tmux包括运行的命令全部消失,重新恢复又要不少时间,所以配置了一下tmux自动保存以及恢复。
烤粽子
2022/04/29
3K0
10 行代码,用 Python 创建一个 Windows 桌面快捷方式!
对于 Python 栈的小伙伴来说,miniconda 是一款非常棒的工具,它可以帮助我们快速的开启虚拟环境,并在独立的环境中使用特有的第三方库,从而达到不同环境之间的隔离效果。
崔庆才
2021/10/20
4.2K0
conda 删除源_conda删除包
记录自己新建一个py3.5的conda环境,遇到镜像连接超级慢,清华的镜像也不太行的亚子,发现之前安装的anaconda中有一个源速度还可以。 一、查看自己conda的链接 进入cmd conda info 调出conda的信息
全栈程序员站长
2022/11/10
3.5K0
conda 删除源_conda删除包
GoldenEye靶机渗透
我们在小学一年级的时候就学过了编码,&#这种类型的一看就是html编码,拎去解码,得到了一串 InvincibleHack3r
Elapse
2020/08/17
7560
Miniconda安装和使用
Miniconda是什么? 要解释Miniconda是什么,先要弄清楚什么是Anaconda,它们之间的关系是什么? 而要知道Anaconda是什么,最先要明白的是搞清楚什么是Conda,参考:Conda简单教程。 一言以蔽之,Conda是Python中用于管理依赖包和虚拟环境的工具,Anaconda是一个带有Conda工具的软件包(附带了Conda、python和150多个科学软件包及其相关的包),而Miniconda是一个Anaconda的轻量级替代,默认只包含了Python和Conda。 也就是说,安装了Miniconda,就可以直接使用Python和Conda了。
编程随笔
2022/09/27
2.5K0
红队渗透项目之GoldenEye
简介 该项目是以伟大的詹姆斯邦德电影GoldenEye为主题创作的,目标是获取最底层的flag.txt文本信息,该项目作为OSCP考试培训必打的一个项目环境,该作者评定该环境为渗透中级水准难度。接下来不管是零基础学习渗透者,还是有些基础的渗透者,甚至是高水平的渗透人员读该文章都能学习到一些红队的技巧和知识。
FB客服
2022/02/23
1.8K0
红队渗透项目之GoldenEye
Java 读取 Windows 设备的唯一性标识及定位
在 Windows 系统中,获取设备唯一性标识及定位信息对设备管理、安全监控等场景意义重大。本文介绍 Java 中几种实现方法,如 JNA 库、WMI4Java 库及通过 JNI 结合 Windows API。
Yeats_Liao
2025/01/08
3540
Java 读取 Windows 设备的唯一性标识及定位
python输出unicode编码_python gbk codec
解决方案如下: 打开报错的倒数第三行的history.py文件,定位到82行,源代码如下:
全栈程序员站长
2022/09/30
1.3K0
python输出unicode编码_python gbk codec
【vulhub靶场】GoldenEye
vulhub官网:https://www.vulnhub.com/entry/goldeneye-1,240/ 百度云盘:https://pan.baidu.com/s/1nUb9NwtZkmgPcEbt7jWfXQ?pwd=90lq 靶机:10.10.10.155 kali :10.10.10.146
没事就要多学习
2024/07/18
2850
【vulhub靶场】GoldenEye
iOS通过http post上传图片
//ASIFormDataRequest方式 POST上传图片 -(NSDictionary )addPicWithDictionary:(NSDictionary )sugestDic{ NSDi
用户8983410
2021/10/31
9240
android安全题目KGB Messenger 解题
大佬的解题步骤: 安卓逆向学习 之 KGB Messenger的writeup(1) 安卓逆向学习 之 KGB Messenger的writeup(2) 安卓逆向学习之KGBMessenger的writeup(3)
tea9
2022/09/08
7220
android安全题目KGB Messenger 解题
TypeScript系列教程九《高级类型》
这个技巧在运行时赋值表达式十分有用,例如冷冻一个对象( frozen object)):
星宇大前端
2021/07/29
5730
Conda:误解与迷思
翻译自:https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/ 译者:taopanpantao 链接:http://blog.csdn.net/taopanpantao/article/details/53982752 我试着尽可能简洁,但如果你想要跳过这篇文章,并得到讨论的要点,你可以阅读每个标题以及下面的摘要。 神话#1:Conda是一个发行版,不是一个软件包管理器 现实:Conda是一个包管理器;Anacond
数据科学社区
2018/02/02
6.1K1
Python: 探究py2与py3除法的区别
在用python2解释器运行python3代码的时候,出现了bug。debug后发现是因为python3中的/ 原本表示 精确除法,却被python2解释器解释成了 地板除,最终导致了错误。因此我上网查阅了相关资料,并总结如下表:
JNingWei
2018/09/28
8270
业界 | 大乌龙,俄罗斯最先进的机器人里头竟然是个小伙子
动动退,扭扭腰~~~你看现在的机器人多么自然,是不是边上的主持人和它比起来更像机器人。
大数据文摘
2018/12/26
4450
哪种一致性哈希算法才是解决分布式缓存问题的王者?
导语 | 一致性哈希是由Karger等人于1997年提出的一种特殊的哈希算法,目的是解决分布式缓存的问题,现在在分布式系统中有着广泛的应用。本文将对ketama、jump consistent hash、rendezvous hash和maglev hash四种算法进行对比分析。 一、一致性哈希的特性 平衡性 不同key通过算法映射后,可以比较均衡地分布到所有的后端节点上。 单调性 当有新的节点上线后,系统中原有的key要么还是映射到原来的节点上,要么映射到新加入的节点上,不会出现从一个老节点重新
腾讯云开发者
2021/06/17
3.5K0
Tensorflow | win10中安装tensorflow-0.12.1 (0.12.1以后的版本安装均适用)
本文首发在CSDN博客:http://blog.csdn.net/xxzhangx/article/details/54379255 前几天,谷歌推出了windows对tensorflow的支持,我参考下面两篇博文来安装了我的tensorflow。 为表示对原作者的尊敬,先列出参考的文章。 参考文献 https://m.aliyun.com/yunqi/articles/68435 http://blog.csdn.net/zhuxiaoyang2000/article/details/5
努力在北京混出人样
2018/05/14
3.2K0
推荐阅读
相关推荐
“不是 Cursor 不够强,是 Claude Code 太猛了” !创始人详解Claude Code如何改写编程方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档