递推是动态规划的前置技能,本质就是找规律、推公式:从已知的初始条件出发,一步步推出后面的结果。
和递归不同,递推是从小往大算(正推),不用函数调用自己,不容易爆栈。核心步骤:
f[i] 的含义——"第 i 个状态的值"f[i] 和前面哪些 f[j] 有关f[i] 依赖 f[i-1],必须从 i=2 往后推,不能乱序。DP 里也一样,顺序错了结果就炸。
经典例题:爬楼梯。每次可以走 1 阶或 2 阶,问到第 n 阶有多少种走法。
💡 这个递推式和斐波那契一模一样:f[n] = f[n-1] + f[n-2]。递推比递归快得多,因为没有重复计算。
爬楼梯问题中,f[1]=1, f[2]=2,请问 f[5] 等于多少?
递推和递归的关键区别是什么?
如果爬楼梯每次可以走 1、2、3 阶,递推关系式是?
#include <iostream>
using namespace std;
int main() {
int n; cin >> n;
long long f[50] = {0}; // 用 long long 防溢出
f[1] = 1; // 只能放 1×1
f[2] = 2; // 两个1×1 或 一个1×2
for (int i = 3; i <= n; i++)
f[i] = f[i-1] + f[i-2]; // 最后放1×1 + 最后放1×2
cout << f[n] << endl;
return 0;
}
// 输入 4 → 输出 5