比赛 20120705 评测结果 AAAWAAWAWA
题目名称 数字计算 最终得分 70
用户昵称 QhelDIV 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-05 11:27:14
显示代码纯文本
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("puzzle.in");
ofstream fout("puzzle.out");
string S;
int T,L;
unsigned long long Nu[30][30],f[30][300],g[30][300];

void Initialize()
{
int i,j;
	for(i=1;i<=L;i++)
		for(j=i;j<=L;j++)
			Nu[i][j]=Nu[i][j-1]*10+S[j]-'0';
	for(i=1;i<=L;i++)
		for(j=0;j<=T;j++)
		{
			f[i][j]=1000000000;
			g[i][j]=1000000000;
			if(Nu[1][i]==j)
				f[i][j]=0,g[i][j]=0;
		}
	for(i=0;i<=T;i++)
		f[0][i]=1000000000,g[0][i]=1000000000;
}

void dp()
{
unsigned long i,j,k,l;
	for(i=1;i<=L;i++)
		for(j=0;j<=T;j++)
		{
			if(S[i]=='0')
				f[i][0]=1;
			for(k=0;k<i;k++)
				if(Nu[k+1][i]!=0 && (j/Nu[k+1][i])*Nu[k+1][i]==j)
					f[i][j]=min(f[i][j],f[k][j/Nu[k+1][i]]+1);
			for(k=1;k<i;k++)
				for(l=k+1;l<i;l++)
					if(j>=Nu[k+1][l]*Nu[l+1][i])
					{
						f[i][j]=min(f[i][j],g[k][j-Nu[k+1][l]*Nu[l+1][i]]+2);
						f[i][j]=min(f[i][j],f[k][j-Nu[k+1][l]*Nu[l+1][i]]+2);
					}
			for(k=0;k<i;k++)
				if(j>=Nu[k+1][i])
				{
					g[i][j]=min(g[i][j],g[k][j-Nu[k+1][i]]+1);
					g[i][j]=min(g[i][j],f[k][j-Nu[k+1][i]]+1);
				}
		}
	if(min(f[L][T],g[L][T])==1000000000)
		fout<<-1<<endl;
	else
		fout<<min(f[L][T],g[L][T])<<endl;
}

void Solve()
{
int i;
	fin>>S>>T;
	while(T>=0)
	{
		L=S.length();S.insert(0," ");
		Initialize();
		dp();
		fin>>S>>T;
	}
}

int main()
{
	Solve();
	
	fin.close();
	fout.close();
}