|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"文章中找新博客地址

两个字符串的编辑距离-动态规划方法

概念 字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中...
  • ac540101928
  • ac540101928
  • 2016年10月11日 11:51
  • 7837

算法之美——求解 字符串间最短距离(动态规划)

算法之美——求解 字符串间最短距离(动态规划) 分类: 算法 动态规划2012-09-04 18:20 1796人阅读 评论(2) 收藏 举报 distancestring算法in...
  • jfkidear
  • jfkidear
  • 2014年09月07日 11:44
  • 2926

动态规划(最小字符串编辑距离实现)

动态规划 : 两种特性 基本思想 动态规划计算字符串的最少编辑距离 与递归计算对比 java代码实现...
  • jjfly999
  • jjfly999
  • 2016年04月18日 23:29
  • 1204

C++动态规划算法之计算字符串距离

计算字符串距离 Description 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为: 修改一个字符(如把“a”替换为“b”)删除一个字符(如把“traveling”变为“...
  • C20190413
  • C20190413
  • 2017年07月13日 09:49
  • 273

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

描述 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为: 修改一个字符(如把“a”替换为“b”)删除一个字符(如把“traveling”变为“travelng”) 比...
  • July_xunle
  • July_xunle
  • 2017年04月20日 19:14
  • 455

动态规划-计算字符串距离

仅有参考代码
  • qq_26140973
  • qq_26140973
  • 2016年12月31日 09:53
  • 173

字符串的修改(动态规划-最短编辑距离)

1187: 字符串的修改 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 6  Solved: 5 [Submit][Status][Web ...
  • baidu_23955875
  • baidu_23955875
  • 2015年07月24日 15:01
  • 1856

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

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

字符串编辑距离相似度-动态规划

http://www.cnblogs.com/xudong-bupt/p/3182051.html 1.概念   编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。...
  • lqglqglqg
  • lqglqglqg
  • 2015年08月27日 16:03
  • 280

【动态规划】字符串最小编辑距离Java实现

问题:给定一个源串和目标串,能够对源串进行如下操作: 在给定位置上插入一个字符 替换任意字符 删除任意字符 要求写一个程序,返回最少的操作数,使得对源串进行这些操作后等于目标串...
  • shihui512
  • shihui512
  • 2016年03月23日 21:06
  • 1005
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:|NOIOJ|动态规划|2988:计算字符串距离
举报原因:
原因补充:

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