Twistzz__ @ 2023-10-08 23:45:59
不懂呐 ! ! ! 求大佬帮助
#include<bits/stdc++.h>
using namespace std;
int dp[5003][5003],len=1,n;
void H(int a){
for(int i=1;i<=len;i++)dp[a][i]=dp[a-1][i]+dp[a-2][i];
for(int i=1;i<=len;i++){
if(dp[a][i]/10!=0 && dp[a][i+1]==0)len++;
dp[a][i+1]+=dp[a][i]/10;
dp[a][i]%=10;
}
}
int main(){
scanf("%d",&n);
dp[1][1]=1;
dp[2][1]=2;
for(int i=3;i<=n;i++)H(i);
while(dp[n][len]==0)len--;
for(int i=len;i>=1;i--)printf("%d",dp[n][i]);
return 0;
}
by Jianbing_Juan @ 2023-10-08 23:59:19
要用高精度。@1132tbs
by MrcFrst @ 2023-10-09 07:26:37
@Jianbing_Juan 你说得对,但是 void H(int a)
函数貌似就是在实现高精度。
by Jianbing_Juan @ 2023-10-09 11:44:56
@MrcFrst_LRY 哦。。那我再看一眼
我大意了啊
by Jianbing_Juan @ 2023-10-09 12:18:34
知道了。你的代码使得 len
一直增加,超出了数组限制。应当在每次状态转移以后都去除前导零,使 len
减小。
改了一处,AC了
#include<bits/stdc++.h>
using namespace std;
int dp[5003][5003],len=1,n;
void H(int a){
for(int i=1;i<=len;i++)dp[a][i]=dp[a-1][i]+dp[a-2][i];
//cout<<a<<' '<<len<<endl; //debug
for(int i=1;i<=len;i++){
if(dp[a][i]/10!=0 && dp[a][i+1]==0)len++;
dp[a][i+1]+=dp[a][i]/10;
dp[a][i]%=10;
}
//下面是新添加的代码
while(dp[a][len]==0)len--;
}
int main(){
scanf("%d",&n);
dp[1][1]=1;
dp[2][1]=2;
for(int i=3;i<=n;i++)H(i);
while(dp[n][len]==0)len--;
for(int i=len;i>=1;i--)printf("%d",dp[n][i]);
putchar('\n');
return 0;
}
by Jianbing_Juan @ 2023-10-09 12:19:34
@Jianbing_Juan @1132tbs
可以了
by Twistzz__ @ 2023-10-09 18:12:02
懂了懂了,谢谢大佬!!! @Jianbing_Juan