[作业系列]算法第3章上机实践报告

摘要:
提示:字符串长度不超过2000个字符。=b[j-1]));//也就是由dp[i][j-1]+1和dp[i-1][j]+1和dp[i-1][j-1]+(a[i-1]!=b[j-1]));cout˂˂dp[l1][l2]˂˂endl;}4.算法时间和空间复杂度两层for循环,时间复杂度是O;二维dp数组,空间复杂度是O;5.心得体会对dp还是不够熟悉,第三题用了十来二十分钟才弄出dp方程式,如果是权哥估计看到题目没过多久就能弄出来了由于队内分工的时候dp是权哥搞的,所以我对dp的熟悉度不算太高,导致做题的时候用的时间比我想象中要多,感觉还是要多做一点dp的题目保持对dp的题感。

1.实践题目

7-3编辑距离问题

2.问题描述

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A到 B的编辑距离,记为d(A,B)。 对于给定的字符串A和字符串B,计算其编辑距离 d(A,B)。

输入格式:

第一行是字符串A,文件的第二行是字符串B。

提示:字符串长度不超过2000个字符。

输出格式:

输出编辑距离d(A,B)

输入样例:

在这里给出一组输入。例如:

fxpimu

xwrs

输出样例:

在这里给出相应的输出。例如:

5


3.算法描述

设A串长度为l1,B串长度为l2,那么开一个dp[i][j]记录当长度为i的A串的时候变成长度为j的B串时的最短编辑距离。那么dp[0...l1][0]初始化为0...l1,dp[0][0...l2]初始化为0...l2.

那么dp[i][j]的状态转移方程就是

dp[i][j]=min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+(a[i-1]!=b[j-1]));

//也就是由dp[i][j-1]+1和dp[i-1][j]+1和dp[i-1][j-1]+(a[i-1]!=b[j-1])的最小值转移过来的;

当时做的时候没想太多,交了一发有bug的代码但是过了,应该是样例没特意卡空串。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 2005;
char a[maxn];
char b[maxn];
int dp[maxn][maxn];
int main()
{
  cin>>a;
  cin>>b;
  int ans = 0;
  int flag = 0;
  int l1 = strlen(a);
  int l2 = strlen(b);
  if(l1==0)
    ans = l2;
  else if(l2==0)
    ans = l1;
  else
  {
	for(int i = 1;i<=l1;i++)
	    dp[i][0]=i;
	for(int j =1;j<=l2;j++)
	    dp[0][j]=j;
	for(int i = 1;i<=l1;i++)
	{
		for(int j = 1;j<=l2;j++)
		{
			if(a[i-1]==b[j-1])
			  flag = 0;
			else
			  flag = 1;
			dp[i][j]=min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+flag);
		}
	}
  }
	cout<<dp[l1][l2]<<endl;
}

很明显上面的代码是有bug的,因为我用cin输入根本就不需要特判l1还有l2是否为0,不过当时没有在意这个细节,现附上改进代码

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 2005;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
	cin.getline(a,2001);
	cin.getline(b,2001);
	int l1 = strlen(a);
	int l2 = strlen(b);
	for(int i = 1;i<=l1;i++)
	  dp[i][0]=i;
	for(int j =1;j<=l2;j++)
	  dp[0][j]=j;
	for(int i = 1;i<=l1;i++)
	  for(int j = 1;j<=l2;j++)
		dp[i][j]=min(min(dp[i][j-1]+1,dp[i-1][j]+1),dp[i-1][j-1]+(a[i-1]!=b[j-1]));
	cout<<dp[l1][l2]<<endl;
}

4.算法时间和空间复杂度

两层for循环,时间复杂度是O(l1*l2);

二维dp数组,空间复杂度是O(l1*l2);

5.心得体会

对dp还是不够熟悉,第三题用了十来二十分钟才弄出dp方程式,如果是权哥估计看到题目没过多久就能弄出来了

由于队内分工的时候dp是权哥搞的,所以我对dp的熟悉度不算太高,导致做题的时候用的时间比我想象中要多,感觉还是要多做一点dp的题目保持对dp的题感。(虽然正式比赛的时候dp也是权哥搞的,我最多也就和他讨论一下思路)

免责声明:文章转载自《[作业系列]算法第3章上机实践报告》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇rsync命令详解(转)ATOM介绍和使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python基础学习-字符编码

一、字符编码总结: 1、内存固定使用unicode,我们可以改变的是存入硬盘采用格式      英文+汉字-》unicode-》gbk      英文+日文-》unicode-》shift-jis      万国字符》-unicode-》utf-8 2、文本文件存取乱码问题 :      解决办法:                 编码格式应该设置成支持文...

sz/rz实现及cat binary文件时乱码问题

一、嵌入式系统中文件传输这个工具之前还的确是没有使用到过,可能的原因是因为之前一直使用桌面系统fedora core发行版本,开发主要使用busybox文件系统,而这两种版本中都没有自带sz/rz工具。它们的作用是通过串口来发送和接收文件,虽然说是串口,所有的支持串口协议的软件或者链路都可以,例如使用telnet/ssh之类的远程链接工具,主机之间的通讯使...

在lua的string库和正则表达式

一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作字符串,而是返回一个结果 string.len(s):返回字符串的长度. string.lower(s):变小写. string.upper(s):变大写....

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ) 1.Linux shell 截取字符变量的前8位 实现方法有如下几种: expr substr “$a” 1 8 echo $a|awk ‘{print substr(,1,8)}’ echo $a|cut -c1-8 echo $ expr $a : ‘(....

正则表达式(一)

一、简介 正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 随后,发...

Java-数据类型(八种基本数据类型)

1、整数类型:byte,short,int,longbyte:一般跟文件操作有关,比如上传、下载。长度8位,-128-127 byte numbyte1=133; //报错:cannot convert from int to byte //不能从int类型转换为byte类型 //整数常数看作int类型,但是如果取值范围在-128-127之间的话,自动把i...