Unit2_2:动态规划DP

news2024/11/29 5:25:11

文章目录

  • 一、最长公共子序列
    • 分析
    • 填表
    • 伪代码
    • 过程
    • 时间复杂度
  • 二、最长公共子串问题
    • 分析
    • 过程
    • 时间复杂度
  • 最小编辑距离
    • 背景
    • 分析
    • 状态转移方程
    • 填表
    • 伪代码
    • 案例

一、最长公共子序列

子序列:指从原序列中选取出来的具有相对顺序的一组元素,而这些元素不一定是连续的
在这里插入图片描述
X和Y的最长公共子序列是Z。

分析

在这里插入图片描述
Z k = ( z 1 , . . . , z k ) Z_k=(z_1,...,z_k) Zk=(z1,...,zk) X [ 1.. i ] X[1..i] X[1..i] Y [ 1.. j ] Y[1..j] Y[1..j]的最长公共子序列( L C S LCS LCS),最大值用 d i , j d_{i,j} di,j表示

若 x i = y j ,则 z k = x i = y j ,且 z k − 1 是 X [ 1.. i − 1 ] 和 Y [ 1.. j − 1 ] 的 L C S 。 若x_i = y_j,则z_k = x_i = y_j,且z_{k−1}是X[1..i−1]和Y[1..j−1]的LCS 。 xi=yj,则zk=xi=yj,且zk1X[1..i1]Y[1..j1]LCS

若 x i ≠ y j ,这意味着 L C S 不以 x i 结束,也不以 y j 结束。 那么 Z k 要么是 X [ 1.. i − 1 ] 和 Y [ 1.. ] j ] 的 L C S ,或 X 的 L C S [ 1.. i ] 和 Y [ 1.. j − 1 ] 。 我们继续使用两种情况下更大的 L C S 计数。 若xi \neq yj,这意味着LCS不以xi结束,也不以yj结束。\\ 那么Z_k要么是X [1..i−1]和Y[1..]j]的LCS,或X的LCS [1..i]和Y [1..j−1]。\\我们继续使用两种情况下更大的LCS计数。 xi=yj,这意味着LCS不以xi结束,也不以yj结束。那么Zk要么是X[1..i1]Y[1..]j]LCS,或XLCS[1..i]Y[1..j1]我们继续使用两种情况下更大的LCS计数。

因此可得:

d i , j = { d i − 1 , j − 1 + 1 i f   x i = y i m a x ( d i − 1 , j , d i , j − 1 ) i f   x i ≠ y i d_{i,j}=\left\{ \begin{array}{ll} d_{i-1,j-1} +1& if \space x_i=y_i \\ max ( d_{i-1,j} , d_{i,j-1} )& if \space x_i \neq y_i \nonumber \end{array} \right. di,j={di1,j1+1max(di1,j,di,j1)if xi=yiif xi=yi

填表

在这里插入图片描述
同样,我们创建另一个 m × n m×n m×n矩阵 p [ i , j ] p[i, j] p[i,j],对于 1 ≤ i ≤ m ,且 1 ≤ j ≤ n 1≤i≤m,且1≤j≤n 1im,且1jn,来存储指向计算中使用的元素的箭头。因此,我们可以稍后重建 L C S LCS LCS的元素

伪代码

Longest-Common-Subsequence(X,Y)
//Initialization
for i ← 0 to m do
	d[i,0] ← 0
end
for j ← 0 to m do
	d[0,j] ← 0
end

//Dynamic Programming
for i ← 0 to m do
	for j ← 0 to m do
		if xi = yi then
			d[i,j] ← d[i-1,j-1]+1
			p[i,j]="LU"    //"LU" indicates left up arrow
		end
	end
	else if d[i-1,j] >= d[i,j-1] then
		d[i,j] ← d[i-1,j]
		p[i,j]="U"    //"U" indicates up arrow
	end
	else
		d[i,j] ← d[i,j-1]
		p[i,j]="L"    //"L" indicates left arrow
	end
end
return d,p
Print-LCS(p,X,i,j)
if i is equal to 0 or j is equal to 0 then
	return NULL;
end
if p[i,j] is equal to "LU” then
	Print-LCS(p,X,i-1,j-1);
	print xi;
end
else if p[i,j] is equal to "U”  then
	Print-LCS(p,X,i-1,i);
end
else
	Print-LCS(p,X,i,j-1);
end

过程

在这里插入图片描述
然后根据p的指示找出最长公共子序列即可

时间复杂度

两层循环,时间复杂度 T ( n ) = O ( n m ) T(n)=O(nm) T(n)=O(nm)

二、最长公共子串问题

子串:指从原序列中选取出来的具有相对顺序的一组元素,而且这些元素一定是连续的
在这里插入图片描述

分析

此题和上一个 L C S LCS LCS不同,不能设 Z k = ( z 1 , . . . , z k ) Z_k=(z_1,...,z_k) Zk=(z1,...,zk) X [ 1.. i ] X[1..i] X[1..i] Y [ 1.. j ] Y[1..j] Y[1..j]的最长公共子串( L C S LCS LCS),最大值用 d i , j d_{i,j} di,j表示。因为以此结尾的 x i 和 y j x_i和y_j xiyj若相同, d i , j d_{i,j} di,j也不一定等于 d i − 1 , j − 1 + 1 d_{i-1,j-1}+1 di1,j1+1,可能字串在中间,无法递归。

DP无法进行下去时可以加以限制,我们只需要定义 Z k = ( z 1 , . . . , z k ) Z_k=(z_1,...,z_k) Zk=(z1,...,zk) X [ 1.. i ] X[1..i] X[1..i] Y [ 1.. j ] Y[1..j] Y[1..j] x i x_i xi或和 y j y_j yj结尾的最长公共子串( L C S LCS LCS),最大值用 d i , j d_{i,j} di,j表示,此时就能递归进行下去了。

若 x i = y j ,则 z k = x i = y j ,且 z k − 1 是 X [ 1.. i − 1 ] 和 Y [ 1.. j − 1 ] 的 L C S 。 若x_i = y_j,则z_k = x_i = y_j,且z_{k−1}是X[1..i−1]和Y[1..j−1]的LCS 。 xi=yj,则zk=xi=yj,且zk1X[1..i1]Y[1..j1]LCS

若 x i ≠ y j ,这意味着 L C S 不以 x i 结束,也不以 y j 结束。 若xi \neq yj,这意味着LCS不以xi结束,也不以yj结束。 xi=yj,这意味着LCS不以xi结束,也不以yj结束。

d i , j = { d i − 1 , j − 1 + 1 i f   x i = y i 0 i f   x i ≠ y i d_{i,j}=\left\{ \begin{array}{ll} d_{i-1,j-1} +1& if \space x_i=y_i \\ 0& if \space x_i \neq y_i \nonumber \end{array} \right. di,j={di1,j1+10if xi=yiif xi=yi

最后,我们可以通过计算所有可能的结束位置i和j的最大值来得到最长的公共子串。
L C S ( X , Y ) = m a x ( d i , j ) LCS(X,Y)=max(d_{i,j}) LCS(X,Y)=max(di,j)
填表也是一致
在这里插入图片描述
但这里维护位置就很简单了,因为子串是连续的,因此只需要记录末尾位置和最大长度即可:用 l m a x l_{max} lmax p m a x p_{max} pmax分别存储公共子字符串的最大长度及其位置i(或j)。所以,我们可以稍后从X(或Y)重建元素。


Longest-Common-Substring(X,Y)
//Initialization
lmax ← 0
pmax ← 0
for i ← 0 to m do
	d[i,0] ← 0
end
for j ← 0 to n do
	d[0,j] ← 0
end

//Dynamic Programming
for i ← 1 to m do
	for j ← 1 to n do
		if xi != yi then
			d[i,j] ← 0
		end
		else
			d[i,j] ← d[i-1,j-1]
			if d[i,j]>lmax then
				lmax ← d[i,j]
				pmax ← i
			end
		end
	end
	
end
return lmax,pmax
Print-LCS(X,lmax,pmax)
if lmax is equal to 0 then
	return NULL;
end
for i ← (pmax-lmax+1) to pmax do
	print xi
end

过程

在这里插入图片描述

时间复杂度

两层循环,时间复杂度 T ( n ) = O ( n m ) T(n)=O(nm) T(n)=O(nm)

最小编辑距离

背景

当把“algorithm”误输入为“algorithm”时,系统可能自动帮助搜索最优的调节词矫正。可运用于机器翻译,信息提取和语音识别。

给定两个数组 X = ( x 1 , x 2 , . . . , x m ) , Y = ( y 1 , y 2 , . . . , y n ) 给定两个数组X=(x_1,x_2,...,x_m),Y=(y_1,y_2,...,y_n) 给定两个数组X=(x1,x2,...,xm),Y=(y1,y2,...,yn),编辑距离是将X转换为Y的编辑操作的最小次数

分析

编辑一共有三种操作:
    添加字母
    删除字母
    替换一个字符。
因为实际考虑中每个操作都需要付出相应的代价 c o s t cost cost,为了简化问题,设每个操作 c o s t = 1 cost=1 cost=1

定义 D [ i , j ] 为子字符串 X [ 1.. i ] 和 Y [ 1.. j ] 的最小编辑距离 定义D[i,j]为子字符串X[1..i]和Y [1..j]的最小编辑距离 定义D[i,j]为子字符串X[1..i]Y[1..j]的最小编辑距离

X [ 1.. i ] 变成 Y [ 1.. j ] X[1..i]变成Y [1..j] X[1..i]变成Y[1..j]有三种情况:
   将 X [ 1.. i − 1 ] 变成 Y [ 1.. j ] X[1..i-1]变成Y [1..j] X[1..i1]变成Y[1..j]并删除 X [ i ] X[i] X[i]
       M E D ( c x y − > d a b ) = M E D ( c x − > d a b ) + 1 MED(cxy->dab)=MED(cx->dab)+1 MED(cxy>dab)=MED(cx>dab)+1
   将 X [ 1.. i ] 变成 Y [ 1.. j − 1 ] X[1..i]变成Y [1..j-1] X[1..i]变成Y[1..j1]并插入Y[j]
       M E D ( c x y − > d a b ) = M E D ( c x y − > d a ) + 1 MED(cxy->dab)=MED(cxy->da)+1 MED(cxy>dab)=MED(cxy>da)+1
   如果 X [ i ] ≠ Y [ j ] X[i] \neq Y[j] X[i]=Y[j],将 X [ 1.. i − 1 ] 变成 Y [ 1.. j − 1 ] X[1..i-1]变成Y [1..j-1] X[1..i1]变成Y[1..j1]并将 X [ i ] 替换成 Y [ j ] X[i]替换成Y[j] X[i]替换成Y[j]
       M E D ( c x y − > d a b ) = M E D ( c x − > d a b ) + 1 MED(cxy->dab)=MED(cx->dab)+1 MED(cxy>dab)=MED(cx>dab)+1
       M E D ( c x y − > d a b ) = M E D ( c x − > d a ) + 1 MED(cxy->dab)=MED(cx->da)+1 MED(cxy>dab)=MED(cx>da)+1

状态转移方程

D [ i , j ] = m i n { D [ i − 1 , j ] + 1 D [ i , j − 1 ] + 1 D [ i − 1 , j − 1 ] + { 0 i f   X [ i ] = Y [ j ] 1 i f   X [ i ] ≠ Y [ j ] D[i,j]=min\left\{ \begin{array}{ll} D[i-1,j] +1\\ D[i,j-1] +1\\ D[i-1,j-1]+\left\{ \begin{array}{ll} 0 & if \space X[i]=Y[j]\\ 1 & if \space X[i] \neq Y[j] \nonumber \end{array} \right.\nonumber \end{array} \right. D[i,j]=min D[i1,j]+1D[i,j1]+1D[i1,j1]+{01if X[i]=Y[j]if X[i]=Y[j]

同时,我们创建另一个矩阵 p [ i , j ] ( 1 ≤ i ≤ m , 1 ≤ j ≤ n ) p[i, j](1≤i≤m, 1≤j≤n) p[i,j](1im,1jn)来存储指向计算中使用的元素的箭头,用于恢复操作的最优序列。

p [ i , j ] = { L e f t i f   I n s e r t i o n U p i f   D e l e t i o n L e f t U p i f   S u b s t i t u t i o n p[i,j]=\left\{ \begin{array}{ll} Left& if \space Insertion\\ Up& if \space Deletion\\ Left Up& if \space Substitution \nonumber \end{array} \right. p[i,j]= LeftUpLeftUpif Insertionif Deletionif Substitution

填表

最初,我们用 j j j填充矩阵 D [ 0 , j ] D[0,j] D[0,j]的第一行,用 i i i填充矩阵 D [ i , 0 ] D[i, 0] D[i,0]的第一列。

空串到一个长为 j j j的串或者长为 i i i的串到空串,最短做法就是一个个删除或者添加。

在这里插入图片描述

伪代码

Minimum-Edit-Distance(X,Y)
//Initialization
for i ← 0 to m do
	d[i,0] ← i
	p[i,0]="U'
end
for j ← 0 to m do
	d[0,j] ← j
	p[0,j]="L"
end

//Dynamic Programming
for i ← 1 to m do
	for j ← 1 to n do
		if xi != yi then
			c ← 1
		end
		else
			c ← 0
		end
		
		if d[i-1][j-1]+c <= d[i-1][j]+1 and
			d[i-1][j-1]+c <= d[i][j-1]+1 then
			d[i][j] ←  d[i-1][j-1]+c
			p[i][j] ←  "LU"
		end
		else if d[i-1][j]+1 <= d[i-1][j-1]+c and
			d[i-1][j]+1 <= d[i][j-1]+1 then
			d[i][j] ← d[i-1][j]+1
			p[i][j] ←  "U"
		end
		else
			d[i][j] ← d[i][j-1]+1
			p[i][j] ←  "L"
		end
	end
	return d,p
end
Print-MED(p,X,i,j)
if i is equal to 0 or j is equal to 0 then
	return NULL;
end
if p[i,j] is equal to "LU” then
	Print-MED(p,X,i-1,j-1);
	if xi = yi then
		do nothing
	end
	else
		print Substitue xi with yi
	end
end
else if p[i,j] is equal to "U” then
	Print-MED(p,X,i-1,i);
	print Delete xi
end
else
	Print-MED(p,X,i,j-1);
	print Insert xi
end

案例

在这里插入图片描述
根据P找到具体操作路径
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内衣洗衣机和手洗哪个干净?家用小型洗衣机推荐

在最近的几年来&#xff0c;人们对生活和健康的追求越来越高&#xff0c;使得越来越多的内衣洗衣机也走进了我们日常生活的视线&#xff0c;许多研究显示&#xff0c;单纯只是手洗是不能彻底消除我们贴身衣物上的细菌&#xff0c;而机洗则可以有效地消除大部分的细菌&#xff0…

毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代

自动驾驶技术正以前所未有的速度不断演进&#xff0c;而其中的关键之一就是毫米波雷达技术。作为自动驾驶系统中的核心感知器件之一&#xff0c;毫米波雷达在保障车辆安全、实现精准定位和应对复杂环境中发挥着不可替代的作用。本文将深入探讨毫米波雷达技术在自动驾驶中的关键…

报错 documentation/kbuild: is a directory. stop(Windows 内置Linux子系统WSL编译Linux内核)

目录 背景 苦苦求索 解决方案 背景 Windows 10的内置子系统Linux 编译SDK,在clean 时出现的报错. 苦苦求索 网上很多说是文件名有空格, 这确实会导致这个问题. 所以要先排除目录,文件名没有空格的情况. 找到名字有空格的文件 find ./ -name "* *"若是没有输出…

Ubuntu安装步骤

点击文件 --> 新建虚拟机&#xff1a; 找到第一章下载的ubuntu镜像文件&#xff0c;然后下一步 自定义名称和位置&#xff0c;然后下一步 根据需要定内存&#xff0c;2G以上即可&#xff1a; 单个文件即可 点击完成 回车&#xff0c;然后等待安装 回车 回车 回车 按上下键找…

EF Core 数据库映射成实体类

首先在 NuGet 包管理器中安装三个包 Microsoft.EntityFrameworkCore.SqlServer 是一个用于与 SQL Server 数据库进行交互的实体框架核心包。这个包提供了方便的方法和工具&#xff0c;用于在 .NET Core 应用程序中操作 SQL Server 数据库。 Microsoft.EntityFrameworkCore.Too…

PTA_乙级_1008

首先&#xff0c;它翻转前部分&#xff08;0 到 N-M-1&#xff09;。 然后&#xff0c;它翻转后部分&#xff08;N-M 到 N-1&#xff09;。 最后&#xff0c;它整体翻转整个数组&#xff08;0 到 N-1&#xff09; #include<iostream> using namespace std;// 反转数组的…

ABAP 7.58更新概览

背景 ABAP 7.58对应的ABAP平台版本和S4HANA版本是2023&#xff0c;如果大家确定自己的系统版本&#xff0c;也可以通过SM51 release notes查看SAP Kernel参数值&#xff0c;与下图对应。 前言 ABAP 7.58更新了很多内容啊&#xff0c;对于CDS和ABAP restful programming mod…

基于SSM的广告管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

八个提升编程体验的VS Code插件

1.GitHub Copilot 安装链接&#xff1a;https://marketplace.visualstudio.com/items?itemNameGitHub.copilot GitHub Copilot 是开发人员的人工智能编码伴侣&#xff0c;可以实时提供代码建议。 这个扩展使编码变得轻而易举。这个扩展可以改善编码体验&#xff0c;提高生产…

在window10上安装Flink-1.18.0

一、Flink介绍 1、Flink是什么&#xff1a; Flink是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。是一个大数据处理引擎的处理框架,是针对流进行的处理. 它是Apache 旗下的一个框架和分布式的处理引擎,用于对无界和有界的数据进行状态的计算。 …

没有数据,没有实验条件怎么发表SCI论文?欢迎参加孟德尔随机化方法培训班!!!...

孟德尔随机化是什么&#xff1f;怎么用孟德尔随机化方法撰写发表论文&#xff1f;郑老师团队开设的利用孟德尔随机化方法快速撰写SCI论文课程包含&#xff1a;孟德尔随机化方法的基本介绍、利用孟德尔随机化方法撰写论文的过程、讲课老师现身说法介绍从学习到论文发表路径、以及…

【Docker】iptables基本原理

在当今数字化时代&#xff0c;网络安全问题变得越来越重要。为了保护我们的网络免受恶意攻击和未经授权的访问&#xff0c;我们需要使用一些工具来加强网络的安全性。其中&#xff0c;iptables是一个强大而受欢迎的防火墙工具&#xff0c;它可以帮助我们控制网络流量并保护网络…

vtk夹角计算控件

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;renderWindow中创建一个夹角测量控件&#xff0c;通过三个点确定一个夹角 典型的控件类继承关系&am…

超声波清洗机怎么选?优质清洁力强超声波清洗机推荐

清洁物品对于大部分朋友来说都是件麻烦事情&#xff0c;能不动手就不动手。眼镜清洗也是一样的道理&#xff0c;随着科技发展&#xff0c;一些智能小家电的出现给我们的生活带来很大便利&#xff01;超声波清洗机不仅能够清洗眼镜&#xff0c;还可以清洗首饰、化妆刷等生活中的…

大小仅为人血细胞的1/10?揭秘纳米机器人的厉害之处

原创 | 文 BFT机器人 纳米机器人是一种比血细胞小10倍的微型机器人&#xff0c;有望彻底改变医疗保健行业。纳米技术与下一代软件平台和监督机器学习相结合&#xff0c;提供了广泛的强大的诊断、监测和治疗工具。 纳米机器人&#xff08;nanorobots&#xff09;旨在执行非常具…

golang工程中间件——redis常用结构及应用(set,zset)

Redis 命令中心 这些篇文章专门以应用为主&#xff0c;原理性的后续博主复习到的时候再详细阐述 set 集合&#xff0c;为了描述它的特征&#xff0c;我们可称呼为无序集合&#xff1b;集合的特征是唯一&#xff0c;集合中的元素是唯一存在 的&#xff1b; 存储结构 元素都…

易点易动固定资产管理系统:定制流程与用量控制的高效管理利器

固定资产管理对于企业来说至关重要&#xff0c;而如何提高固定资产管理的效率和精确度一直是企业管理者关注的焦点。易点易动固定资产管理系统以其自定义固定资产流程和用量控制功能&#xff0c;成为了提升固定资产管理效率的利器。本文将详细介绍易点易动固定资产管理系统的自…

【技术驿站】分布式基础与常见面试问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

虚幻5.3打包Windows失败

缺失UnrealGame二进制文件。 必须使用集成开发环境编译该UE项目。或者借助虚幻编译工具使用命令行命令进行编译 解决办法&#xff1a; 1.依次点击平台-项目启动程序 2.点击后面的按钮进行设置 3.稍等后&#xff0c;打包后的程序即可运行&#xff0c;之后就可以愉快的打包了

10个改变你Figma体验的高效插件!

Figma Ex 实用指数&#xff1a;⭐️⭐️⭐️⭐️⭐️ figma插件一直受到批评&#xff0c;很难找到。特别是一旦插件安装得太多&#xff0c;你就得去大海捞针&#xff0c;这是浪费时间。 这个工具可以使Figma的所有插件直接悬浮在右边的画布上&#xff0c;最重要的是显示每个插…