[洛谷P1279][题解]字串距离

题目戳我

很明显的这题是一道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;
}

完结撒花

猜你喜欢

转载自www.cnblogs.com/juruoajh/p/11821698.html