返回首页 C++ 模板

递推算法模板

从已知推未知——找到状态转移方程,逐步求解

递推 状态转移 斐波那契 GESP4
#include <bits/stdc++.h>
using namespace std;

int main() {
    // ====== 1. 斐波那契数列 ======
    // f(1)=1, f(2)=1, f(n)=f(n-1)+f(n-2)
    const int N = 50;
    long long fib[N + 1];
    fib[1] = fib[2] = 1;
    for (int i = 3; i <= N; i++)
        fib[i] = fib[i-1] + fib[i-2];
    cout << fib[10] << endl;  // 55

    // ====== 2. 爬楼梯 ======
    // 每次走1或2步,到第n阶有多少种走法
    int n = 10;
    long long dp[n + 1];
    dp[1] = 1; dp[2] = 2;
    for (int i = 3; i <= n; i++)
        dp[i] = dp[i-1] + dp[i-2];

    // ====== 3. 上台阶(1/2/3步)======
    dp[1] = 1; dp[2] = 2; dp[3] = 4;
    for (int i = 4; i <= n; i++)
        dp[i] = dp[i-1] + dp[i-2] + dp[i-3];

    // ====== 4. 数塔问题 ======
    int m = 5;
    int tower[10][10] = {
        {5}, {8,3}, {12,7,16}, {4,10,11,6}, {9,5,3,8,7}
    };
    // 从底部往上递推
    for (int i = m-2; i >= 0; i--)
        for (int j = 0; j <= i; j++)
            tower[i][j] += max(tower[i+1][j], tower[i+1][j+1]);
    cout << tower[0][0] << endl;

    return 0;
}

📖 要点说明

⚠️ 常见错误