比赛 |
NOIP_5 |
评测结果 |
AAAAT |
题目名称 |
添加号 |
最终得分 |
80 |
用户昵称 |
zqzas |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2008-09-24 21:30:39 |
显示代码纯文本
#include <stdio.h>
#include <string.h>
#define maxn 210
#define maxm 30
int n,m,f[maxn][maxm][maxn];
char ans[maxn],s[maxn];
FILE *f1,*f2;
//全部倒存
int cmp(int *a,int *b)
{
int i;
for (i=maxn-1;i>=0;i--)
{
if (a[i]<b[i])
return -1;
if (a[i]>b[i])
return 1;
}
return 0;
}
void plus(int x[],int *b)
{
const int P=10;
int i,c[maxn]={0};
for (i=0;i<=n+5;i++)
{
c[i+1]=(c[i]+x[i]+b[i])/P;
c[i]=(c[i]+x[i]+b[i])%P;
}
for (i=0;i<=n+5;i++)
x[i]=c[i];
}
void getNum(int x[],int a,int b)/*num[a][b]*/
{
int i,j=0,y[maxn]={0};
for (i=b;i>=a;i--)
y[j++]=s[i]-'0';
plus(x,y);
}
void run(void)
{
int i,j,k,min,beg=0,zan[maxn][maxn];
//init f[i][0]=num[0][i]
for (i=0;i<n;i++)
{
getNum(f[i][0],0,i);
}
for (i=1;i<n;i++)
for (j=1;j<=m;j++)
{
memset(zan,0,sizeof(zan));
zan[maxn-1][maxn-1]=9;
min=maxn-1;
for (k=j-1;k<=i-1;k++)
{
getNum(zan[k],k+1,i);
plus(zan[k],f[k][j-1]);
if (cmp(zan[k],zan[min])<0)
min=k;
}
for (k=0;k<=n+5;k++)
f[i][j][k]=zan[min][k];
}
for (i=n+5;i>=0;i--)
if (f[n-1][m][i]!=0)
{
beg=i;
break;
}
for (i=beg;i>=0;i--)
{
ans[beg-i]=f[n-1][m][i]+'0';
}
ans[beg+1]=0;
}
void ini(void)
{
fscanf(f1,"%s%d",&s,&m);
n=strlen(s);
}
int main(void)
{
f1=fopen("exam4.in","r");
f2=fopen("exam4.out","w");
ini();
run();
fprintf(f2,"%s",ans);
fclose(f1);fclose(f2);
return 0;
}