很明显的这题是一道dp,主要讲一下几个细节
1.初始化
我们需要初始化边界情况也就是一个字符串为空的情况
#----------# #----------#
A:aaaaaa A:□□□□□□
B:□□□□□□ or B:bbbbbb
#----------# #----------#
这时f[i][0]=i*k,f[0][j]=j*k。
另外注意都为空也就是f[0][0]=0
2.dp
这道题的转移有三种
(1)字符对字符 A:xxx...a B:xxx...b 由f[i-1][j-1]转移得来 (2)字符对空格 A:xxx...a B:xxx...□ 或 A:xxx...□ B:xxx...b 由f[i-1][j]或f[i][j-1]转移得来
具体看代码
#include<bits/stdc++.h> using namespace std; string a,b; inline int d(char a,char b){ return a>b?(int)a-b:(int)b-a; } //f[i][j]表示A_i与B_j的距离 int f[2333][2333],k; //1.初始化 inline void Ini(){ for(int i=1;i<=a.length();i++)f[i][0]=i*k; for(int i=1;i<=b.length();i++)f[0][i]=i*k; f[0][0]=0; } int main() { cin>>a>>b>>k; Ini(); //2.dp部分 for(int i=1;i<=a.length();i++){ for(int j=1;j<=b.length();j++){ f[i][j]=min(min(f[i-1][j],f[i][j-1])+k,f[i-1][j-1]+d(a[i-1],b[j-1])); } } cout<<f[a.length()][b.length()]<<endl; return 0; }
完结撒花