您的位置:首页 > 其它

hdu 1502 字符串dp与高精度运算(mark)

2015-04-29 00:34 567 查看
难得的dp思路都是对的,但是没想到高精度

dp思路:以目前某一种字符还可以放多少个为d数组下标 数组内存储有多少种。

我的:

#include <stdio.h>

#include<string.h>
int n,d[65][65][65];
int dp(int i,int j,int k)
{
   if(i==0&&j==0&&k==0)return
0;
   if(d[i][j][k])return
d[i][j][k];
   if(i>j&&j>k)
    {
       if(k>0)
           d[i][j][k]=dp(i,j-1,k)+dp(i,j,k-1)+dp(i-1,j,k);
       if(k==0)
           d[i][j][k]=dp(i,j-1,k)+dp(i-1,j,k);
    }
   if(i==j&&j>k)
    {
       if(k>0)
       d[i][j][k]=dp(i,j-1,k)+dp(i,j,k-1);
       if(k==0)
           d[i][j][k]=dp(i,j-1,k);
    }
   if(i>j&&j==k)
    {
       if(k>=1)
        {
          d[i][j][k]=dp(i,j,k-1)+dp(i-1,j,k);
        }
       if(k==0)
        {
           d[i][j][k]=dp(i-1,j,k);
        }
    }
   if(i==j&&j==k&&k>=1)
    {
       d[i][j][k]=dp(i,j,k-1);
    }
   return
d[i][j][k];
};
int main(int argc,const
char * argv[]) {
   while(1)
    {
       if(scanf("%d",&n)!=1)
           break;
        memset(d,0,sizeof(d));
        d[1][0][0]=1;
        printf("%d\n\n",dp(n,n,n));
    }

    
   return
0;
}

对的:#include <stdio.h>

#include <string.h>

#include <algorithm>

using namespace std;

char dp[65][65][65][85];

void add(char a[],char b[],char back[])

{

    int i,j,k,up,x,y,z,l;

    char *c;

    if(strlen(a) > strlen(b))

        l = strlen(a)+2;

    else

        l = strlen(b)+2;

    c = (char*)malloc(l*sizeof(char));

    i = strlen(a)-1;

    j = strlen(b)-1;

    k = 0;

    up = 0;

    while(j>=0 || i>=0)

    {

        if(i<0) x = '0';

        else

            x = a[i];

        if(j<0) y = '0';

        else

            y = b[j];

        z = x-'0'+y-'0';

        if(up)

            z++;

        if(z>9)

        {

            up = 1;

            z%=10;

        }

        else

            up = 0;

        c[k++] = z+'0';

        i--;

        j--;

    }

    if(up)

        c[k++] = '1';

    i = 0;

    c[k] = '\0';

    for(k-=1; k>=0; k--)

        back[i++] = c[k];

    back[i] = '\0';

}

int main()

{

    int n,i,j,k;

    for(i = 0; i<=60; i++)

        for(j = 0; j<=60; j++)

            for(k = 0; k<=60; k++)

                strcpy(dp[i][j][k],"0");

    strcpy(dp[1][0][0],"1");

    strcpy(dp[1][1][0],"1");

    strcpy(dp[1][1][1],"1");

    for(i = 2; i<=60; i++)

    {

        for(j = 0; j<=i; j++)

        {

            for(k = 0; k<=j; k++)

            {

                if(i-1>=j)

                    add(dp[i-1][j][k],dp[i][j][k],dp[i][j][k]);

                if(j-1>=k)

                    add(dp[i][j-1][k],dp[i][j][k],dp[i][j][k]);

                if(j>=k-1)

                    add(dp[i][j][k],dp[i][j][k-1],dp[i][j][k]);

            }

        }

    }

    while(~scanf("%d",&n))

    {

        printf("%s\n\n",dp

);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: