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;
}
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;
}
相关文章推荐
- Hdu 1502 Regular Words (java高精度 + DP)
- hdu 1502 Regular Words DP + 高精度 第一个java
- HDU - 1502 Anniversary party 【树形dp入门】
- hdu 1502 java大数+简单dp(最长公共子序列类似)
- hdu 1042 N! 高精度运算
- HDU - 4495 (字符串哈希+二分+DP)
- hdu 1502 Regular Words(DP)
- Hdu 5568 sequence2 高精度 dp
- hdu 1042 N! 高精度运算
- HDU1134 Game of Connections 高精度+DP
- HDU 5735 Born Slippy(拆值DP+位运算)
- HDU 1502 三维dp加大数
- HDU 1502 Regular Words(大数+dp)
- HDU 1002 (高精度加法运算)
- HDU 1002 A + B Problem II 高精度加法程序 覆盖大量字符串处理基础 详细注释
- HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)
- Censored! - POJ 1625(ac自动机+简单dp+高精度运算)
- 字符串练习题: 【HDU 2457】 DNA repair(AC自动机+DP)
- 高精度运算专题-输出函数与字符串转数字函数(Output function and the string to number function)
- hdu 5568 高精度(重要) DP