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