ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2758 编辑距离做题笔记

2022-05-13 08:00:34  阅读:161  来源: 互联网

标签:int 题解 cin 笔记 P2758 3005 编辑 tie strlen


这题是昨天做的,写到一半打模拟赛了,断了网,没有存,顺带吐槽洛谷博客没有草稿箱,再加上今天上午也有模拟赛,所以咕咕咕到了现在才来写做题笔记。开始看题时一脸懵逼,可能是因为平时做 dp 题想太少且看题解太多的原因吧,经常想不出状态转移方程,只好看来题解,题解里有两种做法,一种递归,一种递推,由于递归过于罕见,就选择了自己比较熟悉的递推,具体思路是用 \(s_{i,j}\) 表示 a 序列的 1 到 i 部分变成 b 序列的 1 到 j 部分至少需要几次操作。状态转移方程: \(s_{i,j}\) 可以从 \(s_{i-1,j}\)、\(s_{i,j-1}\) 和 \(s_{i-1,j-1}\) 推出,若 \(a_i = b_j\) 则 \(s_{i,j} = s_{i-1,j-1}\),因为新加的 \(a_i\) 和 \(b_j\) 之间无需转换,否则需要转换一次,状态转移方程为:\(s_{i,j} = min(s_{i-1,j},s_{i,j-1},s_{i-1,j-1})+1\)。

#include <bits/stdc++.h>
  using namespace std;
char c[3005],d[3005];
int n,m,s[3005][3005],i,j;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>c+1>>d+1;
	n=strlen(c+1);
	m=strlen(d+1);
	for (i=1;i<=n;i++)
	{
		s[i][0]=i;
	}
	for (i=1;i<=m;i++)
	{
		s[0][i]=i;
	}
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
		{
			if (c[i]==d[j]) s[i][j]=s[i-1][j-1];
			else s[i][j]=min(s[i-1][j-1],min(s[i][j-1],s[i-1][j]))+1;
		}
	}
	cout<<s[n][m]<<endl;
	return 0;
}

标签:int,题解,cin,笔记,P2758,3005,编辑,tie,strlen
来源: https://www.cnblogs.com/Jason142/p/16265276.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有