动态规划(Dynamic Programming)
dp是什么?
dp是一种编程方法;将一个问题拆成几个子问题,分别求解这些子问题,即可推断出大问题的解。
- 无后效性
"未来与过去无关",这就是无后效性。如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响;
- 有重复的子问题
子问题会被求解多次;
- 最优子结构
大问题的最优解可以由小问题的最优解推出,这个性质叫做“最优子结构性质”;
什么时候可以用dp?
根据以上三个概念,我们如何判断一个问题能否使用dp解决呢?能将大问题拆成几个小问题,且满足无后效性、最优子结构性质
- 计数问题:如用n种资源完成某个方法的数量有多少种;
- 优化:如达成某成目的需要多少钱或者走多少走的问题,这些问题我们在用递归或搜索求解时,因为会枚举所有的可能的路经,当时间复杂度达到如O(2^n)和n的规模很大时,就可以使用dp来进行降维;
dp的通常实现的方法
- Top-down,记忆化递归,从大到小;例如一开始要求解f(10),那f(10)=f(8)+f(9),求解过的会放到内存里(map,array,list等);
- Bottom-up,通常意义上我们定义的DP,从小到大;例如要先求解到dp[1],才能求解dp[2],再能求解dp[3];
dp的典型应用
- Fibonacci sequence (code)
- LCS:最长公共子序列
- Knapsack
- Floyd-Warshall
- Bellmen-Ford
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)