Link
解
转换题意,可以得知:
· 多余的空格是没有用的
· 一个字母要么和另一串的字母匹配要么就与空格匹配
· 无后效性
设 f [ i ] [ j ] f[i][j] f[i][j] 为 第一个串处理完i个,第二个串处理完j个的最小距离
DP方程:
f[i][j] = min{f[i-1][j]+k, f[i][j-1]+k, f[i-1][j-1]+abs(a[i]-b[j])}
//第一个串的字符匹空格,第二个串的字符匹空格,上下串字符匹配
代码
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
string a, b;
int n1, n2, k, w1[3000], w2[3000], f[3000][3000];
int main(){
cin>>a>>b;
scanf("%d", &k);
n1 = a.size(); n2 = b.size();
for(int i = 1; i <= n1; ++i){
w1[i] = a[i-1] - 96;
f[i][0] = k * i;
}
for(int i = 1; i <= n2; ++i){
w2[i] = b[i-1] - 96;
f[0][i] = k * i;
}
f[0][0] = 0;
for(int i = 1; i <= n1; ++i)
for(int j = 1; j <= n2; ++j)
f[i][j] = min(min(f[i-1][j] + k, f[i][j-1] + k), f[i-1][j-1]+abs(w1[i]-w2[j]));
printf("%d", f[n1][n2]);
}