关于动态规划(dp)

article/2025/9/29 9:57:31

**动态规划(DP)
一.基本概念
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
它针对满足特定条件的一类问题,对各维度进行分阶段、有顺序、无重复、决策性的遍历求解。
动态规划算法将原问题视作若干个重叠子问题的逐层递进,每个子问题的求解过程都构成一个阶段。
在完成前一个阶段的计算之后,动态规划才会进入到下一个阶段的计算。
子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
为了保证这些计算能按顺序、不重复地进行,动态规划要求已经求解地子问题不受后续状态的影响。
这个条件也被称为无后效性
无后效性:即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
换句话说,动态规划对状态空间的遍历构成一张有向无环图,遍历顺序就是一个拓扑序。
节点对应问题中的状态,边对应问题的转移,转移的选取就是动态规划中的决策。
在很多情况下,动态规划用于求解最优化问题。
此时,下一阶段的最优解应该能由前面各状态的各阶段子问题的最优解导出。
这个条件被称为最优子结构性质。
最优子结构:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。
状态、阶段、决策是动态规划的三要素,
而子问题重叠性质、无后效性、最优子结构性质是求解的三个基本条件。
一般求解过程:
要去刻画最优解的结构特征(确定三要素,检查三个基本条件);
尝试递归地定义最优解的值(求出状态转移方程);
计算最优解(确定转移顺序);
利用计算出的信息构造一个最优解。

二.记忆化搜索
想体验把暴搜改改就是正解的快感吗?想体验状压 dp 看似状态多到爆炸实际一跑却嗷嗷快(实际有效的状态数很少)的荣耀吗?记忆化搜索,符合您的需求!买不到吃亏买不到上当!只要 998 , 记忆化搜索带回家!记忆化搜索,记忆化搜索,再说一遍,记忆化搜索!
首先,你的搜索需要满足一些前提:
不依赖任何 外部变量
答案以返回值的形式存在,而不能以参数的形式存在(就是不能将 定义成 dfs(int pos,int nowans) , 这里面的 nowans 不符合要求)。
对于相同一组参数, 返回值总是相同的(如果你满足了前两条这一条一般也满足,随机化除外)。
此时我们就可以建立一个记忆数组,将一组参数第一次传入时的返回值记录下来,之后再次传入时就可以直接返回中的值。
简单举个例子,数字三角形**

int dfs(int i, int j)
{if (i > n) return 0;     //如果下越界,则返回0,不会贡献答案if (j > i) return -inf;  //如果右越界,则返回负无穷,就不可能被选择if (m[i][j] < inf) return m[i][j];return m[i][j] = max(dfs(i + 1, j), dfs(i + 1, j + 1)) + mp[i][j];
}

其实说白了,记忆化搜索就是dp
根据记忆化搜索的参数可以直接得到dp的状态,反之亦然
根据记忆化搜索的递归关系可以写出状态转移方程,这个方程可以直接写出循环式的dp,只不过是反的(想想为什么?),反之亦然
大部分记忆化搜索时空复杂度与 不加优化的 dp 完全相同
最重要的一点:二者思想类似!! 核心思想均为:利用对于相同参数答案相同的特性,对于相同的参数(循环式的dp体现为数组下标),记录其答案,免去重复计算,从而起到优化时间复杂度的作用。这,便是二者的精髓。
优点
记忆化搜索可以避免搜到无用状态, 特别是在有状态压缩时
不需要注意转移顺序
边界情况非常好处理, 且能有效防止数组访问越界
写起来简单易懂
有些 dp(如区间 dp)用记忆化搜索写很简单但正常 dp 很难
记忆化搜索天生携带搜索天赋,可以使用技能”剪枝”!
缺点
致命伤: 不能滚动数组!
有些优化比较难加
由于递归, 有时效率较低但不至于 TLE

老样子,举几个例题你就明白了:
let one:
在这里插入图片描述
dp:

#include <iostream>
using namespace std;
int n,a[30][30],f[30][30];
int pmax(int a,int b)
{if(a>b)return a;return b;
}
int main() 
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);}}a[n/2][n/2]+=100000000;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];//这是公式,学了dp的应该知道}}int ans=-1;for(int i=1;i<=n;i++){ans=pmax(ans,f[n][i]);}printf("%d",ans-100000000);return 0;
}

再来个例子:
在这里插入图片描述
爆搜(暴力搜索):

#include<iostream>
using namespace std;
int a[1100],f[1100],s[1100];
int main()
{int ans=0,n=1;while(cin>>a[n]){n++;}for(int i=1;i<n;i++){int falg=1,t=0;for(int j=i-1;j>=1;j--){if(a[j]>=a[i]){if(f[j]>t) {t=f[j];}falg=0;}}if(falg) f[i]=1;else f[i]=t+1;ans=max(ans,f[i]);}cout<<ans<<endl;int m=0,p;for(int i=1;i<=n;i++){int x=9999999,flag=1;for(int k=1;k<=m;k++){if(s[k]>=a[i]){if(s[k]<=x) {x=s[k];p=k;}flag=0;}}if(flag) {m++;s[m]=a[i];}else {s[p]=a[i];}} cout<<m<<endl;return 0;
}

写了这么多,还是请求各位大来给我一个赞


http://chatgpt.dhexx.cn/article/CLoZdIMX.shtml

相关文章

动态规划(DP)的原理、实现及应用

文章目录 1. 由一个例子说开&#xff1a; 斐波那契&#xff08;fibonacci&#xff09;数列 性能测试原因分析2. 记忆化搜索3. 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09; 最优子结构总结一下这几个解法&#xff1a;几个例题 LeetCode 70 Climbing St…

Hi3519AV100与Hi3559AV100在芯片规格 上主要差异

表1-1简要对比了Hi3519AV100与Hi3559AV100在规格方面的差异&#xff0c;Hi3519AV100的具体规格请参见《Hi3519AV100 ultra-HD Mobile Camera SoC 用户指南》。

海思平台(hi3559av100)异构多系统的使用Linux(2*A53+2*A73)+liteos(A53)+liteos(M7)

在文档《SDK安装及升级使用说明》中有对linuxliteos异构多系统的烧写有介绍。这里对其中的一些注意的地方记录以下&#xff0c;以备查验。 由于我的目标是要搭建一个ISP调试环境&#xff0c;就是使用海思的ittp_stream工具能够连接上开发板&#xff0c;并能够实时查看摄像头的…

M302H-ZN-Hi3798MV300/MV300H-当贝纯净桌面-卡刷固件包

M302H-ZN-Hi3798MV300&#xff0f;MV300H-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用…

华为海思 hikey970 详细介绍

前几天申请到了华为的开发板&#xff1a;hikey970 用来做项目的。 板子是这样的: 下面是在网中收集到的信息总结&#xff1a; 基于麒麟970的AI智慧算力&#xff0c;HiKey 970除了支持CPU和GPU的AI运算外&#xff0c;还支持基于NPU的神经网络计算硬件加速。 公开资料显示&am…

海思Hi3519AV100 emmc flash方式 linux系统移植 hitool工具烧写

因为我这里的海思文档只有SPI NOR Flash方式的详细烧写步骤&#xff0c;没有emmc方式的&#xff0c;本文提供一个自己成功的案例仅供参考和记录 1. 准备SDK、安装交叉编译工具、编译osdrv 1.1 解压SDK包 将Hi3519AV100_SDK_Vx.x.x.x.tgz文件放入ubuntu系统下&#xff08;wind…

海思3559:MMZ内存、OS内存配置

前言 海思3559的DDR最大支持到8GB hi3559av100芯片的内存地址范围 (1)通过查阅数据手册可知《Hi3559AV100 专业型 Smart IP Camera SoC 用户指南》&#xff0c;芯片的内存地址范围是0x4000_0000-0x23FFF_FFFF&#xff0c;最大能支持8G内存&#xff1b;   (2)海思芯片把内存分…

劲爆!java架构师百度网盘

第一份资料:Kafka实战笔记 Kafka入门为什么选择KafkaKarka的安装、管理和配置Kafka的集群第一个Kafka程序afka的生产者 Kafka的消费者深入理解Kafka可靠的数据传递

10本Java架构师必读书籍推荐

##### 1.《大型网站系统与Java中间件开发实践》 本书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入&#xff0c;让读者对分布式系统有基本的了解&#xff1b;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁&#xff1b;接着…

Java架构师需要哪些知识?

如何才能达到Java架构师技术要求标准&#xff1f;Java架构师需要熟练掌握复杂的数据结构和算法、熟练使用linux操作系统&#xff0c;Linux线上排除故障、熟悉tcp协议、系统集群、[负载均衡]、反向代理、动静分离&#xff0c;网站静态化、数据库设计能力、队列中间件等知识。 一…

JAVA架构师之路十六:设计模式之责任链模式

JAVA架构师之路十五&#xff1a;设计模式之策略模式 责任链模式 1. 责任链模式2. 登陆案例 3. 登陆案例优化 人生的游戏不在于拿了一副好牌&#xff0c;而在于怎样去打好坏牌&#xff0c;世上没有常胜将军&#xff0c;勇于超越自我者才能得到最后的奖杯。 1. 责任链模式 定义…

BAT面试高级进阶,Java架构师之路

说明 Java生鲜电商平台中由于采用了微服务架构进行业务的处理&#xff0c;买家&#xff0c;卖家&#xff0c;配送&#xff0c;销售&#xff0c;供应商等进行服务化&#xff0c;但是不可避免存在分布式事务的问题。 业界有很多的解决方案&#xff0c;对此我相信大家都百度一下…

JAVA架构师之路-视频学习

https://pan.baidu.com/s/1GK-HNdG_HsNTb_QQ6_L3Tg 目录&#xff1a; 第一套 JAVA高级架构师之旅 第2套 Java互联网架构师netty、mina、nio 第三套 阿里开源Dubbo 【第四套】互联网综合实战项目介绍 【第五套】高性能缓存Memcached服务深度原理及实战视频课程 【第六套】高级J…

JAVA架构师之路十五:设计模式之策略模式

JAVA架构师之路十四&#xff1a;设计模式之模板模式 策略模式 1. 策略模式2. 优惠券案例3. 支付案例 人生的游戏不在于拿了一副好牌&#xff0c;而在于怎样去打好坏牌&#xff0c;世上没有常胜将军&#xff0c;勇于超越自我者才能得到最后的奖杯。 1. 策略模式 定义 策略模式…

走向Java架构师之路:成为架构师要掌握的8大能力

架构师是什么?是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。 如何才能达到Java架构师技术要求标准?Java架构师需要熟练…

JAVA架构师之路十一:设计模式之适配器模式

JAVA架构师之路十&#xff1a;设计模式之组合模式 适配器模式 1. 适配器模式2. 类适配器写法3. 对象适配器写法4. 接口适配器写法 钟表&#xff0c;可以回到起点&#xff0c;但已不是昨天。 生活中处处可见适配现象&#xff1a;手机充电器的充电头&#xff0c;电脑电源适配器&…

Java架构师:概述

一、Java架构师核心技术栈 二、架构师需要具备的其他能力 三、技术选型 四、早期传统JavaWeb开发模式 五、前后端分离开发模式 六、Maven聚合项目 七、数据库设计工具PDMan 八、数据库外键弊端【移除物理外键&#xff0c;而非逻辑外键】 数据库表与表之间字段间不要有物理外键…

Java架构师之路:微服务架构图解和详情

微服务框架搭建&#xff1a; 总体规划框架名称当前技术选型方案微服务框架搭建 开发框架 单体服务SpringBoot 分布式框架SpringCloud 最新框架SpringCloudAlibaba 服务配置中心 服务消息总线 阿里巴巴Nacos、 ConfigBusRabbitMQ配合使用、 携程apolo 服务网关 Spr…

java架构师进阶之路

要想进阶为架构师&#xff0c;不仅要有知识广度&#xff0c;还要有深度。 最近把今天收集的java学习资料整理了下&#xff0c;里面包含了计算机基础、算法和数据结构、常用工具、java核心知识、性能优化、基础框架、数据库、消息队列、缓存中间件、搜索引擎、大数据、RPC、网关…

通往Java架构师之路

Java架构师&#xff0c;应该算是一些Java程序员们的一个职业目标了吧,很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢&#xff0c;总体来说呢&#xff0c;有两方面&#xff0c;一个是基础技术&#xff0c;另一个就是组织能力和提出解决方案能力。…