1. 动态规划入门三部曲:从斐波那契到最小花费爬楼梯
最近在算法训练中重新认识了动态规划(DP)这个老朋友。很多人觉得DP高深莫测,但通过这三道经典题目——斐波那契数、爬楼梯和最小花费爬楼梯,我发现DP的核心思想其实非常直观。下面就用工程师的视角,拆解这三道题背后的通用解题框架和实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DP五步法实战解析
2.1 斐波那契数列:DP的Hello World
斐波那契数列(LeetCode 509)是理解递归和动态规划的最佳入门案例。定义很简单:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)。但用DP实现时有几个关键点:
- DP数组定义:dp[i]表示第i个斐波那契数
- 递推公式:直接对应定义dp[i] = dp[i-1] + dp[i-2]
- 初始化:dp[0]=0, dp[1]=1必须显式初始化
- 遍历顺序:从i=2开始正向遍历,因为每个数依赖前两个数
- 空间优化:实际上只需要维护前两个状态,可将空间复杂度从O(n)降到O(1)
注意:C++中可变长度数组(VLA)不是标准特性,建议使用vector替代
cpp复制int fib(int n) {
if(n <= 1) return n;
vector<int> dp(n+1);
dp[0] = 0; dp[1] = 1;
for(int i = 2; i <= n; ++i)
dp[i] = dp[i-1] + dp[i-2];
return dp[n];
}
2.2 爬楼梯问题:斐波那契的变形
爬楼梯(LeetCode 70)看似与斐波那契无关,但分析后会发现它们共享相同的递推结构:
- 到第n阶的方法数 = 到第n-1阶的方法数(最后迈1步) + 到第n-2阶的方法数(最后迈2步)
- 边界条件:dp[1]=1(1阶只有1种方法),dp[2]=2(2阶可以1+1或直接2)
cpp复制int climbStairs(int n) {
if(n <= 2) return n;
vector<int> dp(n+1);
dp[1] = 1; dp[2] = 2;
for(
