|NOIOJ|动态规划|2988:计算字符串距离

原创 2016年08月29日 18:04:14

http://noi.openjudge.cn/ch0206/2988/

折腾了我很久,终于会了。。

设a数组为第一个字符串,b数组为第二个字符串,数组从下标1开始

对于这个问题,我们设f[i][j]为ai到bj的字符串距离(ai为a[1~i], bi为b[1~j])

设a数组的长度为m,b数组的长度为n


初始:

f[i][0] = i; (1<=i<=m)即为a数组有i个元素,b数组有0个元素

当b数组为空时,a数组到b数组的距离绝对是i

例如下面一组数据:

abcde
(空)

那么距离是什么呢?很显然,删除a数组的各个元素即可,因此距离为i

f[0][i] = i; (1<=i<=n)即为a数组有0个元素,b数组有i个元素

当a数组为空时,a数组到b数组的距离也绝对是i

理由同上,只是进行插入操作


那么下面有四种决策方案:

当a[i] = b[j]时 

1、f[i][j] = f[i-1][j-1]; 因为不需要进行操作,直接继承前面的即可

例如:

b
deb

当前i=1, j=3, 因为a[i] = b[j]问题可以转化为

(空)
de
即转化为ai-1到bj-1的距离

否则

2、f[i][j] = min(f[i-1][j-1]+1); 把a[i]改为b[i], 使他们相等, 因为改了以后,a[i]=b[j],所以可以转化为上面的方法

例如:

c
deb
当前i=1, j=3, 改a[i]为b[j], 则有
b
deb
就变成上面的那个了,这里不再重复讲。

3、f[i][j] = min(f[i][j-1]+1); 在a[i]后面插入b[j]

例如:

c
deb

当前i=1, j=3, 在a[i]后面插入b[j], 则有

cb
deb
当前a[i+1]=b[j],则有

c
de
所以转化成了ai到bj-1的距离
4、f[i][j] = min(f[i-1][j]+1); 删除a[i]
例如:

c
deb
当前i=1, j=3, 删除a[i], 则有
(空)
deb
即转化为ai-1到bj的距离

最后答案为f[n][m].

#include<iostream>
#include<cstdio>  
#include<cstring>   
#include<algorithm> 
#define ms(i,j) memset(i, j, sizeof(i)); 
using namespace std;
char a[1005], b[1005]; 
int f[1005][1005];
int main()  
{
	int t;
	scanf("%d\n", &t);
	while (t--)
	{
		scanf("%s%s", a+1,b+1);
		int m1 = strlen(a+1), m2 = strlen(b+1);
		f[0][0] = 0;
		for (int i=1;i<=m1;i++) f[i][0] = i;
		for (int i=1;i<=m2;i++) f[0][i] = i;
		for (int i=1;i<=m1;i++)
		for (int j=1;j<=m2;j++)
		{
			if (a[i]==b[j]) 
			{
				f[i][j] = f[i-1][j-1];
			}
			else
			{
				f[i][j] = min(f[i-1][j-1], min(f[i-1][j], f[i][j-1]))+1;
			}
		} 
		printf("%d\n", f[m1][m2]);
	}
    return 0;  
}  


版权声明:博客停更,请到"再见,CSDN"文章中找新博客地址

相关文章推荐

动态规划问题学习路线:斐波那契数列,最大递增子序列,松鼠捡苹果,最大公共子序列,字符串编辑距离

基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定...

动态规划 字符串编辑距离

字符串编辑距离

算法——动态规划算法求解字符串的编辑距离

当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念)。 动态规划版求解菲波那切数列关于朴素递归求解菲波那切数列...

动态规划求字符串之间的编辑距离

1.编辑距离的概念    编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字...

动态规划(2)字符串编辑距离

题目描述: 给定一个源串和目标串,能够对源串进行如下操作: 1)在任意位置插入一个字符 2)替换任意字符 3)删除任意字符 写一个程序,实现返回最小操...

openjudge2988 计算字符串距离

动态规划求LCS

OpenJudge_P2988 计算字符串距离(DP)

总时间限制: 1000ms 内存限制: 65536kB 描述 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为: 修改一个字符(如把“a”替换为“b”) 删除一个字符(如把...

编程之美:计算两个字符串的相似度---动态规划实现

问题描述: 把两个字符串变成相同的基本操作定义如下: 1.     修改一个字符(如把 a 变成 b) 2.     增加一个字符 (如 abed...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)