高精度加法+dp:洛谷1255
数据很大,利用高精度加法
实现代码:
#include <bits/stdc++.h>
using namespace std;
int dp[5005][5005];
int len=1;//表示位数
void hp(int k)//k:楼梯阶乘
{
for(int i=1;i<=len;i++)
{
dp[k][i]=dp[k-1][i]+dp[k-2][i];
}
for(int i=1;i<=len;i++)
{
if(dp[k][i]>=10)
{
dp[k][i+1]+=1;
dp[k][i]%=10;
if(dp[k][len+1]>0)
{
len++;
}
}
}
}
int main ()
{
long long n;
scanf("%lld",&n);
dp[1][1]=1,dp[2][1]=2;
for(int i=3;i<=n;i++)
{
hp(i);
}
for(int i=len;i>=1;i--)//逆序输出数组元素即可
{
printf("%d",dp[n][i]);
}
return 0;
}
洛谷p2437:高精度加dp
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
long long len=1;
long long dp[1005][1000];
void high(long long x)
{
long long i;
for( i=1;i<=len;i++)
{
dp[x][i]=dp[x-1][i]+dp[x-2][i];
}
for(long long j=1;j<=len;j++)
{
if(dp[x][j]>9)
{
//if(dp[x][len]>9)len++;
dp[x][j]%=10;
dp[x][j+1]+=1;
}
if(dp[x][len+1]>0)len++;
}
}
int main ()
{
long long m,n;
scanf("%lld%lld",&m,&n);
dp[1][1]=1,dp[2][1]=1;
for(int i=3;i<=n-m+1;i++)
{
high(i);
}
for(long long i=len;i>=1;i--)
{
printf("%lld",dp[n-m+1][i]);
}
return 0;
}