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

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也是权哥搞的,我最多也就和他讨论一下思路)

转载于:https://www.cnblogs.com/kgs719/p/9895455.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值