洛谷 P2758 编辑距离 dp
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2758 编辑距离 dp相关的知识,希望对你有一定的参考价值。
链接地址
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
!皆为小写字母!
输入格式
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
输出格式
只有一个正整数,为最少字符操作次数。
输入输出样例
输入
sfdqxbw
gfdgw
输出
4
思路:
-
状态表示:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示字符串A的前i
位变为字符串Bde前j
位所需要的最小操作次数 -
转移方程:
当 a [ i ] = b [ j ] a[i]=b[j] a[i]=b[j]时, d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i−1][j−1]
否则, d p [ i ] [ j ] = m i n ( m i n ( d p [ i − 1 ] [ j ] + 1 , d p [ i ] [ j − 1 ] + 1 ) , d p [ i − 1 ] [ j − 1 ] + 1 ) dp[i][j] =min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1) dp[i][j]=min(min(dp[i−1][j]+1,dp[i][j−1]+1),dp[i−1][j−1]+1) -
注意:
边界条件需要进行设置
当A字符串长度为0时,需要的操作次数为B的字符串长度
当B字符串长度为0时,需要的操作次数为A的字符串长度
#include<iostream>
#include<string.h>
using namespace std;
char a[2005],b[2005];
int dp[2005][2005];
int main()
{
int last;
cin>>(a+1)>>(b+1);
int len1 = strlen(a+1),len2 = strlen(b+1);
//边界条件进行设置
for(int i=1;i<=len1;i++)
dp[i][0] = i;
for(int i=1;i<=len2;i++)
dp[0][i]=i;
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(a[i]==b[j])
dp[i][j] = dp[i-1][j-1] ;
else dp[i][j] =min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);
}
}
cout<<dp[len1][len2]<<'\\n';
return 0;
}
以上是关于洛谷 P2758 编辑距离 dp的主要内容,如果未能解决你的问题,请参考以下文章