什么是动态规划(Dynamic Programming, DP)
动态规划(DP) 是一种用于最优化问题的算法设计方法,它通过拆解子问题、存储子问题解,避免重复计算,从而提高效率。
动态规划的核心思想
- 最优子结构(Optimal Substructure)
- 一个问题的最优解可以由其子问题的最优解推导出来。
- 重叠子问题(Overlapping Subproblems)
- 计算同一个子问题时会多次出现相同的计算,DP 通过存储这些子问题的解来避免重复计算。
- 状态转移方程(Recurrence Relation)
- 定义一个递推公式,让问题可以从小规模推导到大规模。
区别于贪心算法:
- 贪心算法:每一步选择当前最优,不能回溯,可能得不到全局最优解。
- 动态规划:会记录之前的计算结果,并基于子问题的最优解来构造整体最优解。
C# 示例:使用动态规划求解斐波那契数列
问题描述
计算斐波那契数列 F(n)
,其中:
F(n)=F(n−1)+F(n−2)
且
F(0)=0, F(1)=1
1. 递归(暴力法,效率低)
总结
方法
|
时间复杂度
|
空间复杂度
|
适用场景
|
---|---|---|---|
递归(暴力)
|
O(2ⁿ)
|
O(n)
|
只适合小
n |
记忆化搜索
|
O(n)
|
O(n)
|
适合递归场景
|
动态规划(数组)
|
O(n)
|
O(n)
|
适合
n 较大的情况 |
滚动数组优化
|
O(n)
|
O(1)
|
最优解
|
🚀 动态规划本质是对递归的优化,避免重复计算,提高效率,适用于最优化问题,如背包问题、最长公共子序列等!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2023-02-10 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
2021-02-10 C# 一般处理程序
2021-02-10 C# 利用反射进行深拷贝
2021-02-10 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序
2021-02-10 C# 异步编程
2021-02-10 C#根据输入的字符串来创建类的实例