题目描述
楼梯有N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
题解:
首先这是一个经典的动态规划问题,因为一共两种走法所以从后往前退的话f[n]=f[n-1]+f[n-2]的所以很容易得出递推公式f[n]=f[n-1]+f[n-2]
接下来就是因为他是一个高精问题我们有两种解决办法
1.我们可以通过再开三个辅助数组进行累计。
2.我们可以使用二位数组因为题目数据不大。
这里我们选择第二种办法
以下我们通过代码解释
#include <bits/stdc++.h>
using namespace std;
int f[5040][5040]; //二维数组累加
int len = 1; //记录结果位数
void gj(int k) {
int i;
for (i = 1; i <= len; i++)
f[k][i] = f[k - 1][i] + f[k - 2][i]; //先将结果得出
for (i = 1; i <= len; i++) //高精度
if (f[k][i] >= 10) {
f[k][i + 1] += f[k][i] / 10;
f[k][i] = f[k][i] % 10;
if (f[k][len + 1])
len++;
}
}
int main() {
int n;
cin >> n;
f[0][1] = f[1][1] = 1;
for (int i = 2; i <= n; i++)
gj(i);
for (int i = len; i >= 1; i--) //因为高精度是从最低位存储的所以要倒叙输出
cout << f[n][i];
return 0;
} //结束