传送门

大致题意 : 经典走楼梯问题
分析 : 用斐波那契数列来解即可, f[i] 表示从1走到 i 的方案数, 属性为数量, 一次可上1步或2步
可推出状态转移方程 : f[i] = f[i-1] + f[i-2], 重点是数据范围, n最大是5000, 可知答案是非常之大的,所以需要对答案进行高进度, 可以开一个二维数组来进行高精
ac代码如下 :
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 5050;
int n;
int f[N][N], len = 1;
// f[i][j] 第一维, 表示上到第i个台阶的方案数, 第二维, 表示方案数的位数(高精度)
void solve(int i){
int j;
// cout<<len<<endl;
for(j = 1; j<=len; j++)
f[i][j] = f[i-1][j] + f[i-2][j];
// 高精度
for(j = 1; j<=len; j++){
cout<<len<<" "<<j<<endl;
if(f[i][j]>=10){
f[i][j+1] += f[i][j]/10;
f[i][j] = f[i][j] % 10;
if(f[i][len+1]) len++;
}
}
}
int main()
{
scanf("%d", &n);
f[1][1] = 1;
f[2][1] = 2;
for(int i = 3; i<=n; i++) solve(i);
for(int i = len; i>=1; i--) cout<<f[n][i];
}
本文介绍了一种使用斐波那契数列求解经典走楼梯问题的方法,通过状态转移方程解决上楼梯的不同方案数,并针对数据范围大采用高精度计算,提供了C++代码实现。
1156

被折叠的 条评论
为什么被折叠?



