数楼梯
题目链接 https://www.luogu.com.cn/problem/P1255
非常典型的斐波那契+高精度
浅帮舍友做个题。(不喜欢高精!)
∵“对于60%的数据,N≤50;对于100%的数据,1≤N≤5000”
∴提交了一遍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 }