【DP】洛谷P1279 字串距离

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]);
} 

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/115026991