rnqoj-38-串的记数-dp+大整数加法

2014-11-23 22:57:52 · 作者: · 浏览: 1
dp过程很简单,就是加一个大整数加法。。。
#include  
#include  
#include  
#include  
using namespace std;  
int dp[61][61][61][101];  
void jia(int a,int b,int c,int x,int y,int z)  
{  
    int l1,l2,i,j;  
    l1=dp[a][b][c][0];  
    l2=dp[x][y][z][0];  
    if(l1==0)  
    {  
        for(i=0;i<=l2;i++)  
        {  
            dp[a][b][c][i]=dp[x][y][z][i];  
  
        }  
        return ;  
    }  
    if(l2==0)return ;  
    int ca,leap;  
    leap=0;  
    for(i=1,j=1;i<=l1&&j<=l2;i++,j++)  
    {  
        ca=dp[a][b][c][i]+dp[x][y][z][j]+leap;  
        dp[a][b][c][i]=ca%10;  
        leap=ca/10;  
    }  
    while(i<=l1)  
    {  
        ca=dp[a][b][c][i]+leap;  
        dp[a][b][c][i]=ca%10;  
        leap=ca/10;  
        i++;  
    }  
    while(j<=l2)  
    {  
        ca=dp[x][y][z][j]+leap;  
        dp[a][b][c][j]=ca%10;  
        leap=ca/10;  
        j++;  
    }  
    if(leap>
0) { dp[a][b][c][max(i,j)]=leap; i++,j++; } dp[a][b][c][0]=max(i,j)-1; } int main() { int i,j,k,n; dp[0][0][0][0]=1; dp[0][0][0][1]=1; for(i=0;i<=60;i++) { for(j=0;j<=i;j++) { for(k=0;k<=j;k++) { if(i>=1)jia(i,j,k,i-1,j,k); if(j>=1)jia(i,j,k,i,j-1,k); if(k>=1)jia(i,j,k,i,j,k-1); } } } while(~scanf("%d",&n)) { for(i=dp[n][n][n][0];i>=1;i--) { cout<