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