洛谷题单指南-递推与递归-P1255 数楼梯
原题链接:https://www.luogu.com.cn/problem/P1255
题意解读:n层楼梯,每次上1层或2层,求方案数,典型的斐波那契数列问题。
解题思路:
设f[i]为走到第i层楼的方案,由于每次只能上1层,或者2层,所以要么从i-1层上到i层,要么从i-2层上到i层,
根据加法原理,得到递推公式:f[i] = f[i-1] + f[i-2]
由于楼梯数最大5000,斐波那契数列的复杂度类似于指数级,可以预估5000级楼梯的大致方案数:25000≈(210)500≈(103)500≈101500
数据长度在1500,需要使用高精度计算,通过二维数组可以很好的解决数据存储问题,每一行对应斐波那契数列的一个数。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5005, M = 2000;
int f[N][M]; //每行存一个高精度整数,每行第一个数代表这一行数的长度
int n;
int main()
{
cin >> n;
f[0][0] = 1, f[0][1] = 1; //初始化第一行
f[1][0] = 1, f[1][1] = 1; //初始化第二行
if(n == 1) cout << f[1][1];
else
{
for(int i = 2; i <= n; i++)
{
//高精度加法
for(int j = 1; j <= max(f[i - 1][0], f[i - 2][0]); j++)
{
f[i][j] += f[i - 1][j] + f[i - 2][j];
f[i][j + 1] += f[i][j] / 10;
f[i][j] = f[i][j] % 10;
f[i][0] = j; //更新长度
if(f[i][j + 1]) f[i][0] = j + 1; //如果有进位,再次更新长度
}
}
for(int i = f[n][0]; i >= 1; i--) cout << f[n][i];
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)