P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题解
思路:最后一个阶梯可以一步上或者两步上所以总共步数为f(n)=f(n-1)+f(n-2)
且剩一个阶梯时一种方式f(1)=1,剩两个阶梯时两种方式f(2)=2
代码
#include<iostream>
using namespace std;
int step(int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return step(n - 1) + step(n - 2);
}
int main()
{
int n = 0;
cin >> n;
cout << step(n);
return 0;
}
50%AC,需要考虑高精度
#include<iostream>
using namespace std;
int n,len=0,arr[5005][5003];
void f(int n)//高精度加法
{
int i;
for (i = 0; i <= len; i++)
arr[n][i] = arr[n - 1][i] + arr[n - 2][i];//套用公式
for (i = 0; i <= len; i++) //进位
if (arr[n][i] >= 10)
{
arr[n][i + 1] += arr[n][i] / 10;
arr[n][i] = arr[n][i] % 10;
if (arr[n][len+1])
len++;
}
}
int main()
{
int i;
cin >> n;
arr[1][0] = 1; arr[2][0] = 2; //初始化
for (i = 3; i <= n; i++) //从3开始避免越界
f(i);
for (i = len; i >= 0; i--) //逆序输出
cout << arr[n][i];
return 0;
}
总结:
1.递归经典楼梯问题最后一个阶梯可以一步上或者两步上所以总共步数为f(n)=f(n-1)+f(n-2)
2.先写前面的,高精度搞了很久