题目:P2758
思路
首先,如果1个字符串的长度为0,那答案就是另一个字符串的长度。所以,我们令dp[i][j]表示
a[1…i]转换为b[1…j]所需的最少操作次数。
也就是说:dp[0][j]=j;dp[i][0]=i;
接下来,继续思考,发现如果a[i]==b[j],那么相同,无需变化dp[i][j]=dp[i-1][j-1]
如果不相同,dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1
所以接下来就是代码实现了。嗯,都到这份上了,还需要放吗?
算了,还是把代码给一下吧。
#include <bits/stdc++.h>
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
//极端情况
for(int i=1;i<=strlen(a);i++)
dp[i][0]=i;
for(int j=1;j<=strlen(b);j++)
dp[0][j]=j;
for(int i=1;i<=strlen(a);i++){
for(int j=1;j<=strlen(b);j++){
if(a[i-1]==b[j-1])//相同时距离不变
dp[i][j]=dp[i-1][j-1];
else//不同时取三个位置的最小值再+1
dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
}
cout<<dp[strlen(a)][strlen(b)]<<endl;
return 0;
}
好了,以上就是本期内容。我们下期再见!