/*
zoj_2711 dp+高精度
很简单的dp,不过结果是很大的,必须使用高精度。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int dp[61][61][61][21];
void print( int n )
{
int i;
if( n==0 ) { cout<<0; return; }
for( i=0;i<21;i++ )
if( dp[n][n][n][i]!=0 )
{
cout<<dp[n][n][n][i];
i++;
break;
}
for( ;i<21;i++ )
{
if( dp[n][n][n][i]<1000 ) cout<<'0';
if( dp[n][n][n][i]<100 ) cout<<'0';
if( dp[n][n][n][i]<10 ) cout<<'0';
cout<<dp[n][n][n][i];
}
}
int main()
{
int n,i,j,l,k,y;
memset( dp,0,sizeof(dp) );
for( i=0;i<20;i++ )
dp[1][0][0][i]=0;
dp[1][0][0][20]=1;
for( i=1;i<=60;i++ )
{
for( j=0;j<=i;j++ )
for( k=0;k<=j;k++ )
{
if( k-1>=0 ) //dp[i][j][k]+=dp[i][j][k-1];
{
y=0;
for( l=20;l>=0;l-- )
{
dp[i][j][k][l]=dp[i][j][k][l]+dp[i][j][k-1][l]+y;
y=dp[i][j][k][l]/10000;
dp[i][j][k][l]%=10000;
}
}
if( j-1>=k ) //dp[i][j][k]+=dp[i][j-1][k];
{
y=0;
for( l=20;l>=0;l-- )
{
dp[i][j][k][l]=dp[i][j][k][l]+dp[i][j-1][k][l]+y;
y=dp[i][j][k][l]/10000;
dp[i][j][k][l]%=10000;
}
}
if( i-1>=j ) //dp[i][j][k]+=dp[i-1][j][k];
{
y=0;
for( l=20;l>=0;l-- )
{
dp[i][j][k][l]=dp[i][j][k][l]+dp[i-1][j][k][l]+y;
y=dp[i][j][k][l]/10000;
dp[i][j][k][l]%=10000;
}
}
}
}
while( cin>>n )
{
print(n);
cout<<endl<<endl;
}
return 0;
}
zoj 2711 Regular Words
最新推荐文章于 2021-02-17 13:26:15 发布