数楼梯

题目链接 https://www.luogu.com.cn/problem/P1255

非常典型的斐波那契+高精度

浅帮舍友做个题。(不喜欢高精!)

∵“对于60%的数据,N50;对于100%的数据,1N5000”

∴提交了一遍60分....


 

用二维数组dp[x][i],x表示第几步台阶,i和位数相关。

将走法的位数拆开分别存放在此行的每一列(从1到len)。此行的某一列=上一行的某一列+上上行的某一列。需要注意进位。


 

放AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,len=1,dp[5005][5005];//len为走法的位数(长度)
 4 void hp(int x)
 5 {
 6     for(int i=1;i<=len;i++)//把某一行的数全部计算为前两行的和
 7         dp[x][i]=dp[x-1][i]+dp[x-2][i];
 8     for(int i=1;i<=len;i++)//进位
 9     {
10         if(dp[x][i]>=10)
11         {
12             dp[x][i+1]+=dp[x][i]/10;
13             dp[x][i]=dp[x][i]%10;
14             if(dp[x][len+1])len++;//如果len+1的位置有数,则len++
15         }
16     }
17 }
18 int main()
19 {
20     cin>>n;
21     dp[1][1]=1,dp[2][1]=2;//初始化
22     for(int i=3;i<=n;i++)//防止越界
23         hp(i);
24     for(int i=len;i>=1;i--)//逆序输出
25         cout<<dp[n][i];
26     return 0;
27 }

 

posted @ 2022-03-23 17:34  爱吃虾滑  阅读(28)  评论(0编辑  收藏  举报