📌 什么是动态规划?
动态规划(Dynamic Programming, DP)是一种通过分解问题并存储中间结果来优化递归算法的策略,常用于解决具有重叠子问题和最优子结构的复杂问题。
🧩 核心概念解析
- 状态定义:明确每一步决策后问题的当前状态(如
dp[i]
表示前i个元素的最优解) - 状态转移方程:找到子问题与原问题的关联公式(如
dp[i] = max(dp[i-1], dp[i-2] + ...)
) - 初始化条件:设置初始状态的值(如
dp[0] = 0
或dp[1] = 1
) - 滚动数组优化:减少空间复杂度(适用于仅需前几项的状态)
📈 典型应用场景
背包问题
- 0-1背包:`[扩展阅读](/leetcode_practice)` - 完全背包:`[深入解析](/algorithm_tutorials)`最长公共子序列
- 使用DP数组存储字符匹配结果 - 时间复杂度:`O(n*m)` (n,m为字符串长度)斐波那契数列优化
- 传统递归:`O(2^n)` → DP优化后:`O(n)`
📚 推荐学习资源
- 动态规划入门指南
- 《算法导论》第15章:动态规划详解
- LeetCode DP专题练习
💡 学习建议
- 先掌握递归思想再理解DP
- 通过经典题目(如打家劫舍)巩固技巧
- 使用可视化工具辅助理解状态转移过程