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

第一次遇见动态规划

一、什么是动态规划

动态规划是对问题的各状态维度进行分阶段、有顺序、无重复、决策性的遍历求解的算法思想。

“状态”、“阶段”、“决策”是构成动态规划算法的三要素。

问题能用动态规划求解需要满足三个基本条件:

1、子问题重叠性:动态规划算法是把原问题视作若干个重叠子问题的逐层递进,每个子问题的求解过程都构成一个“阶段”。在完成前一个阶段的计算后,动态规划才会执行下一阶段的计算。

2、无后效性:动态规划算法要求已经求解的子问题不受后续阶段的影响。

3、最优子结构性质:动态规划是用来求解最优化问题。所以下一阶段的最优解应该能够由前面各阶段子问题的最优解导出。(类似于贪心策略)

在求解过程中我们如果能将问题形式化为状态空间,进一步抽象出其“状态转移方程DP”,问题就得到了极大的解决。

以下以例题的形式向读者展现动态规划的思想在实战中的应用,请读者自行思考其韵味。

二、线性DP

1、数字三角形

#include <iostream> using namespace std; const int N=105; int a[N][N]; int dp[N][N];//dp[i][j]表示走到(i,j)时的总和 int main() { int n;cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) dp[i][j]=a[i][j]+max(dp[i-1][j-1],dp[i-1][j]); //点(i,j)是从上一步(i-1,j-1)或(i-1,j)选取最优的策略,即值最大走到的 if(n&1) cout<<dp[n][n/2+1]; else cout<<max(dp[n][n/2],dp[n][n/2+1]);//最后肯定是走到最后一行的中间 return 0; }

2.最长上升子序列(LIS)

#include <iostream> using namespace std; const int N=1e3+5; int a[N]; int dp[N];//dp[i]表示以a[i]结尾的,比a[i]小的最多有几个a[j](j<=i) int main() { int n,ans;cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { dp[i]=1; for(int j=1;j<=i;j++) { if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1); //对于每个以a[i]结尾的dp[i],依次遍历dp[j](j<=i),寻找符合条件的 } ans=max(ans,dp[i]); } cout<<ans; return 0; }

3.最长公共子序列(LCS)

#include <iostream> using namespace std; const int N=1e3+9; int a[N],b[N]; int dp[N][N];//dp[i][j]表示a[1~i]序列和b[1~j]序列中的最长公共子序列的长度 int main() { int n,m;cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int j=1;j<=m;j++) cin>>b[j]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; //当a[i]==b[j]时,可以将他们作为公共元素插入到LCS的后面,使得长度变长1 else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);//这已经包含了dp[i-1][j-1] //当a[i]!=b[j]时,说明此时LCS不会延长,那就从dp[i-1][j]和dp[i][j-1]中取大的作为最长的元素 } } cout<<dp[n][m]; return 0; }

通过这三个基本例题,相信大家已经能够明白用动态规划求解问题的三个基本条件

三、背包

请期待…………

http://www.jsqmd.com/news/594426/

相关文章:

  • 用Python仿真EMC传导干扰:快速验证滤波电路效果的3种方法
  • 2025-2026年全球充电桩加盟品牌推荐:五大口碑产品评测对比顶尖 - 品牌推荐
  • Docker小白也能搞定!Protege 5.5.0最新版一键部署指南(附常见报错解决)
  • 万字干货 | OpenClaw 进阶玩法大全:技能 / 多 Agent / 省钱 / 安全,+ 实战技巧一次学会
  • 力扣热门100题之合并区间
  • 【kv存储】为什么在kv存储项目中需要自定义 kvs_malloc 而非系统 malloc
  • 2025-2026年国内充电桩加盟品牌推荐:TOP5口碑服务评测对比领先 - 品牌推荐
  • SEO 究竟是什么_外链对SEO重要吗_如何建设外链
  • 物联网与ISA-95框架:如何通过标准化实现工业数字化转型
  • 一文详解RPC,深入浅出从原理到主流框架
  • C++/C方向面试题/概念知识点复习汇总(持续更新)
  • SEO_资深运营揭秘:真正有效的SEO技巧有哪些
  • Harness Engineering 实战指南(非常详细),AI 写代码从入门到精通,收藏这一篇就够了!
  • 2026年4月区块链平台测评:数字资产合规流通五大靠谱选择综合调研推荐 - 品牌推荐
  • 补题记录2
  • ESPectro:面向IoT的ESP8266硬件抽象库设计与实践
  • Facebook短剧出海攻略
  • 【PAT甲级真题】- Talent and Virtue (25)
  • 半导体盛会哪家好?2026年度主流芯坛半导体盛会 - 品牌2026
  • 2026年计算机科学论文降AI工具推荐:代码注释和算法描述部分如何降
  • 半导体行业展会推荐:汇聚高规格半导体展会搭建产业交流合作平台 - 品牌2026
  • 5分钟充电500公里?更像为炒作噱头,实现并不容易!大城市建设可能被消防限制!
  • 代码写不动了?传统程序员不转型AI工程化提示词专家,将被AI助手彻底平替
  • 手把手拆解ST FOC库:Circle Limitation的查表法实现与优化技巧
  • 人到中年,生日收到这三条短信,我读了很久
  • 模型轻量化实践:在4GB内存设备运行OpenClaw+Phi-3-vision
  • 半导体全产业链展会哪家好?2026 年半导体优选行业盛会推荐 - 品牌2026
  • 省考面试必看!初心教育不玩虚的,真实口碑+实战演练,上岸更稳
  • 西交提出 OdysseyArena:让智能体真正“学会探索”的长程归纳推理基准
  • 12 3456(2)