[DP] LuoguP1279ストリング距離

リンク

ここに画像の説明を挿入します


解決

質問の意味を変えると、次のことがわかります。
・余分なスペースは役に立たない
・文字が別の文字列と一致するか、スペースと一致する
・後遺症なし

できf [i] [j] f [i] [j]f [ i ] [ j ]
最初の文字列がiを処理し、2番目の文字列が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