比赛 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;
}