比赛 20090916练习赛 评测结果 WWATTWTTTW
题目名称 字符串的距离 最终得分 10
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-10-17 22:01:54
显示代码纯文本
#include <cstdio>
#include <cstring>
using namespace std;

//int f[2011][2011]={0};
const int MAXNUM=1000000000;
int a[2011]={0},b[2011]={0},la,lb,mindis=MAXNUM;

void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

int absint(int a)
{
	if (a<0)
		a=-a;
	return(a);
}

void tryit(int posb,int posa,int disnow)
{
	if (posb>lb)
		return;
	if (disnow>mindis)
		return;
	if (posb==lb)
	{
		int temp;
		temp=disnow+absint(a[posa]-b[posb]);
		if (mindis>temp)
			mindis=temp;
	}
	else
	{
		int i;
		for (i=posa+1;i<=la-lb+posb;i++)
			tryit(posb+1,i,disnow+absint(a[posa]-b[posb]));
	}
}

int main(void)
{
	freopen("blast.in","r",stdin);
	freopen("blast.out","w",stdout);
	int i/*,j,k*/,dis;
	char str[2011];
	scanf("%s",&str);
	la=strlen(str);
	for (i=1;i<=la;i++)
		a[i]=str[i-1];
	scanf("%s",&str);
	lb=strlen(str);
	for (i=1;i<=lb;i++)
		b[i]=str[i-1];
	scanf("%d",&dis);
	if (lb>la)
	{
		swap(la,lb);
		for (i=1;i<=la;i++)
			swap(a[i],b[i]);
	}
	dis*=(la-lb);
	
/*
	for (i=1;i<=la;i++)
	{
		if (i+lb-1>la)
			break;
		for (k=i;k<=i+lb-1;k++)
			f[i][i+lb-1]+=absint(a[k]-b[k-i+1]);
	}
	for (j=lb;j<=la-1;j++)
		for (i=1;i<=la;i++)
		{
			if (i+j>la)
				break;
		}
*/
	
	for (i=1;i<=la-lb;i++)
		tryit(1,i,0);
	printf("%d\n",mindis+dis);
	fclose(stdin);
	fclose(stdout);
	return(0);
}