AcWing 5292:跳台阶 ← 动态规划

【题目来源】
https://www.acwing.com/problem/content/5295/

【题目描述】
一个楼梯共有 n 级台阶,每次可以走一级或两级或三级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。

【输入格式】
共一行,包含一个整数 n。

【输出格式】
共一行,包含一个整数,表示方案数。

【数据范围】
1≤n≤15

【输入样例】
5

【输出样例】
13

【算法分析】
此问题是"计数型"问题,适用于利用动态规划方法解决。利用"最后一步法"求解的分析步骤如下:
1.确定状态
最后一步:走到最后一阶台阶,即走到第n阶台阶时,共有多少种不同的走法。
子问题:根据题意,走到第n阶台阶,有可能是从第n-1阶台阶、第n-2阶台阶或第n-3阶台阶走来的。根据加法原理,问题就转化为走到第n-1阶台阶、走到第n-2阶台阶及走到第n-3阶台阶的走法之和。
状态:根据上述"最后一步"、"子问题"部分的分析,可设状态为f(x):表示走到第x阶台阶时共有多少种走法。
2.状态转移方程
根据上文分析,可得状态转移方程为:f(n)=f(n-1)+f(n-2)+f(n-3)
3.初始条件和边界情况
由于n=0,1,2,3时,根据状态转移方程不能计算出f(0),f(1),f(2),f(3)。故需要将它们设置为初始条件。
根据计算,可得f(0)=0,f(1)=1,f(2)=2,f(3)=4
4.计算顺序
依据状态转移方程确定。

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int maxn=20;
int f[maxn];

int main() {
    int n;
    cin>>n;
    f[0]=1;
    f[1]=1;
    f[2]=2;
    f[3]=4;
    for(int i=3;i<=n;i++){
        f[i]=f[i-1]+f[i-2]+f[i-3];
    }    
    cout<<f[n];
    
    return 0;
}

/*
in:5
out:13
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/112797538
https://www.acwing.com/solution/content/254912/

相关推荐
Bi_BIT11 小时前
代码随想录训练营打卡Day38| 动态规划part06
算法·动态规划
利刃大大15 小时前
【动态规划:01背包】01背包详解 && 模板题 && 优化
c++·算法·动态规划·力扣·背包问题
Miraitowa_cheems1 天前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划
不染尘.2 天前
2025_11_5_刷题
开发语言·c++·vscode·算法·贪心算法·动态规划
Jasmine_llq4 天前
《P6772 [NOI2020] 美食家》
动态规划·状态压缩·矩阵快速幂·事件排序与分段处理·图论基础(图的表示与遍历)
mifengxing5 天前
力扣每日一题——接雨水
c语言·数据结构·算法·leetcode·动态规划·
贝塔实验室6 天前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程
ゞ 正在缓冲99%…6 天前
leetcode1312.让字符串成为回文串的最少插入次数
数据结构·算法·leetcode·动态规划·记忆化搜索
Miraitowa_cheems8 天前
LeetCode算法日记 - Day 88: 环绕字符串中唯一的子字符串
java·数据结构·算法·leetcode·深度优先·动态规划
焜昱错眩..8 天前
代码随想录第四十八天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
算法·动态规划