洛谷 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[i1][j1]
    否则, 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[i1][j]+1,dp[i][j1]+1),dp[i1][j1]+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的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2758 编辑距离

洛谷 P2758 编辑距离

P2758 编辑距离 简单DP

[LuoGu] P2758 编辑距离

洛谷 P1433 DP 状态压缩

洛谷 2758 编辑距离