首页 > 其他分享 >编辑距离与滚动数组优化 - 二维动态规划模板

编辑距离与滚动数组优化 - 二维动态规划模板

时间:2024-07-22 15:31:26浏览次数:13  
标签:int 滚动 中前 编辑 二维 模板 字符串 个字符

题目:编辑距离

思路

显然,定义 \(f[i][j]\) 表示字符串 \(a\) 中前 \(i\) 个字符到 字符串 \(b\) 中前 \(j\) 个字符的编辑距离。

那么对于 \(a_i=b_j\) 时,我们对当前位无需进行任何编辑操作,则 \(f[i][j]=f[i-1][j-1]\) 。

如果 \(a_i \ne b_j\) ,那么我们就要对当前位进行编辑:

  • 对于修改操作,我们先要保证 字符串 \(a\) 中前 \(i-1\) 个字符 已经编辑到了 字符串 \(b\) 中前 \(j-1\) 个字符,接下来才把 \(a_i\) 修改成 \(b_j\) ,所以转移为 \(f[i][j]=f[i-1][j-1]+1\) 。
  • 对于插入操作,因为我们是向 \(a_i\) 后面插入一个 \(b_j\) ,所以我们要保证 字符串 \(a\) 中前 \(i\) 个字符 已经编辑到了 字符串 \(b\) 中前 \(j-1\) 个字符,再同时往这两个字符串后插一个 \(b_j\) ,所以转移为 \(f[i][j]=f[i][j-1]+1\) 。
  • 对于删除操作,由于我们是删除 \(a_i\) 字符,所以我们要保证 字符串 \(a\) 中前 \(i-1\) 个字符 已经编辑到了 字符串 \(b\) 中前 \(j\) 个字符,这样才能删掉 \(a_i\) ,所以方程为 \(f[i][j]=f[i-1][j]+1\) 。

这三种情况取一个 min 即可。

注意初始化,\(f[0][0]=0,f[i][0]=i,f[0][j]=j\) ,因为分别要进行这么多次的删除和插入。

#include <bits/stdc++.h>
using namespace std;
string a,b;
int f[2005][2005];
int main()
{
	cin>>a>>b;
	memset(f,0x3f,sizeof(f));
	f[0][0]=0;
	for(int i=1;i<=a.length();i++)f[i][0]=i;
	for(int i=1;i<=b.length();i++)f[0][i]=i;
	for(int i=1;i<=a.length();i++)
	{
		for(int j=1;j<=b.length();j++)
		{
			if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1];
			else f[i][j]=min(f[i][j],min(f[i-1][j-1]+1,min(f[i-1][j]+1,f[i][j-1]+1)));
		}
	}
	cout<<f[a.length()][b.length()];
	return 0;
}

滚动数组优化

标签:int,滚动,中前,编辑,二维,模板,字符串,个字符
From: https://www.cnblogs.com/zhr0102/p/18316080

相关文章

  • 为什么将小部件添加到滚动视图在 python kivy 中不起作用
    Python文件fromkivymd.appimportMDAppfromkivy.langimportBuilderfromkivy.uix.floatlayoutimportFloatLayoutfromkivy.core.windowimportWindowfromkivy.configimportConfigfromkivymd.uix.listimportOneLineListItem#UkuranwindowConfig.set(&......
  • 易优CMS模板标签downloadpay下载付费
    [基础用法]标签:downloadpay描述:下载模型实现付费,会员专享,会员付费下载,在使用之前先频道模型->下载模型->编辑->开启下载付费使用方法:付费标签需要加载/template/pc/system/download_pay.htm模板文件下载地址:点击下载,该文件放在pc模板目录......
  • 易优CMS模板标签type指定栏目输出单页模型栏目的详细内容
    [基础用法]标签:type描述:获取指定栏目信息用法:{eyou:typetypeid='栏目ID'empty='暂时没有数据'}<ahref="{$field.typeurl}">{$field.typename}</a>{/eyou:type}属性:typeid=''指定栏目ID,如果没有指定则获取当前列表页的栏目IDtype='self'表示当前栏目ty......
  • 最长不降子序列 n log n 方案输出与 Dilworth 定理 - 动态规划模板
    朴素算法不必多说,\(O(n^2)\)的暴力dp转移。优化算法时间为\(O(n\logn)\),本质是贪心,不是dp。思路是维护一个单调栈(手写版),使这个栈单调不降。当该元素\(\ge\)栈顶元素时,把这个元素压入栈中。否则,在单调栈中找到第一个大于该元素的项,把这一项改为这个元素。(因为要......
  • Vue3 - 详解实现网站使用企业微信二维码扫描登录,企业微信授权第三方网站接入企业微信
    前言如果您需要Vue2版本,请访问这篇文章。在vue3|nuxt3网站开发中,详解实现网页集成使用“企业微信扫一扫登录”功能,用户使用手机企业微信app扫描网站的登录二维码后,获取用户身份信息及号码并完成授权登录教程,新手小白完整流程及示例运行代码,支持多种企业微信二......
  • 【搜索】【模板】 IDDFS
    IDDFS使用场景使用dfs由于状态量太大会TLE,bfs会MLE。答案必须很小,一般在20以内。算法原理设置dfs的搜索深度限制\(dep\),dfs穷举\(dep\)层的答案。若在\(dep\)层找到满足条件的情形,则\(dep\)则为答案,否则\(dep\leftarrowdep+1\),继续搜索。优......
  • 【搜索】【模板】记忆化搜索
    记忆化搜索思想是实现DP的一种手段。优点:不关心递推顺序;对于两维及以上的DP,方便处理初始状态和无效状态。缺点:无法使用滚动数组。注意事项:要什么状态搜什么状态;所有的状态转移都要采取直接搜索的数据很傻。越界的状态不能赋值。实现步骤:先判断是否越界,如果越......
  • 【数学】【模板】扩展欧几里得算法
    扩展欧几里得算法思想首先回忆一下裴蜀定理:对于任意一对不全为\(0\)的整数\(a,b\),存在\(x,y\)使得\(ax+by=\gcd(a,b)\)。扩展欧几里得算法就是求出一组解满足\(ax+by=\gcd(a,b)\),这里用到了欧几里得算法,不会的,可以看看我的博客。我们看看怎么求:当\(b=......
  • 【数学】【模板】欧拉定理
    欧拉定理思想若\(a\)与\(n\)互质,则\(a^{\varphi(n)}\equiv1\pmodn\);容易得出当\(n\)为质数时,\(a^{n-1}\equiv1\pmodn\)。证明假设与\(1\simn\)中与\(n\)互质的数字为\(x_1,x_2,x_3,\cdotsx_{\varphi(n)}\),且两两不同。现将它们全部乘以\(a\)得......
  • 【数学】【模板】欧拉函数
    欧拉函数思想\(\varphi(n)\)表示的是\(1\simn\)中与\(n\)互质的个数。怎么求\(\varphi(n)\)呢?先将\(n\)质因数分解:\(n=p_1^{a_1}p_2^{a_2}\cdotsp_k^{a_k}\),那么\(\varphi(n)=n\left(1-\dfrac{1}{p_1}\right)\left(1-\dfrac{1}{p_2}\right)\cdots\left......