【问题描述】
楼梯有n阶台阶,上楼可以一步上1阶,2阶或3阶,编程计算共有多少种不同的走法?
【算法分析】
此问题是“计数型”问题,适用于利用动态规划方法解决。利用“最后一步法”求解的分析步骤如下:
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.计算顺序
依据状态转移方程确定。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
int n;
int f[100];
int main() {
cin>>n;
f[0]=0;
f[1]=1;
f[2]=2;
f[3]=4;
for(int i=4; i<=n; i++) {
f[i]=f[i-1]+f[i-2]+f[i-3];
}
cout<<f[n]<<endl;
return 0;
}
/*
in:5
out:13
in:6
out:24
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/112797538
https://blog.csdn.net/ljp812184246/article/details/51043364