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