比赛 |
20090916练习赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
字符串的距离 |
最终得分 |
100 |
用户昵称 |
magic |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-09-21 19:01:48 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<cmath>
#include<cstring>
#include<stdio.h>
#define maxlong 10000000
using namespace std;
int f[3005][3005];
char a[3005];
char b[3005];
int n,m,k;
int main()
{
freopen("blast.in","r",stdin);
freopen("blast.out","w",stdout);
scanf("%s",&a);
scanf("%s",&b);
scanf("%d",&k);
n=strlen(a)-1;
m=strlen(b)-1;
//f[0][0]=min(abs(a[0]-b[0]),2*k);
for (int i=0;i<=m;i++)
{
f[0][i]=maxlong;
for (int j=0;j<=i;j++)
{
f[0][i]=min(f[0][i],abs(a[0]-b[j]));
}
f[0][i]+=k*i;
f[0][i]=min(f[0][i],(i+2)*k);
}
for (int i=0;i<=n;i++)
{
f[i][0]=maxlong;
for (int j=0;j<=i;j++)
{
f[i][0]=min(f[i][0],abs(a[j]-b[0]));
}
f[i][0]+=k*i;
f[i][0]=min(f[i][0],(i+2)*k);
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
f[i][j]=min(min(f[i-1][j-1]+abs(a[i]-b[j]),f[i-1][j-1]+2*k),min(f[i-1][j]+k,f[i][j-1]+k));
}
}
printf("%d",f[n][m]);
return 0;
}