- 1、本文档共87页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
8.1动态规划概述;8.5字符串动态规划;一个字符串的子序列是指从该字符串中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后得到的字符序列。
例如ace是abcde的子序列,但aec不是abcde的子序列。
给定两个字符串a和b,称字符串c是a和b的公共子序列,是指c同是a和b的子序列。该问题是求两个字符串a和b的最长公共子序列(LCS)。;设计二维动态规划数组dp,其中dp[i][j]为(a0,a1,…,ai-1)和(b0,b1,…,bj-1)的最长公共子序列长度,求dp[i][j]的两种情况。;dp[0][0]=0 初始条件
dp[i][0]=0 边界情况
dp[0][j]=0 边界情况
dp[i][j]=dp[i-1][j-1]+1 a[i-1]=b[j-1]
dp[i][j]=max{dp[i][j-1],dp[i-1][j]} a[i-1]≠b[j-1];1 defLCSlength(a,b): #求dp
2 globaldp
3 m,n=len(a),len(b)
4 dp=[[0]*(n+1)foriinrange(m+1)]
5 dp[0][0]=0
6 foriinrange(m+1): #将dp[i][0]置为0
7 dp[i][0]=0
8 forjinrange(0,n+1): #将dp[0][j]置为0
9 dp[0][j]=0
10 foriinrange(1,m+1):
11 forjinrange(1,n+1): #循环处理a、b所有字符
12 ifa[i-1]==b[j-1]: #情况①
13 dp[i][j]=dp[i-1][j-1]+1
14 else: #情况②
15 dp[i][j]=max(dp[i][j-1],dp[i-1][j])
16 returndp[m][n];当求出dp后如何利用dp求一个最长公共子序列呢?分析状态转移方程最后两行的计算过程可以看出:
若dp[i][j]=dp[i-1][j-1]+1,有a[i-1]=b[j-1],也就是说 a[i-1]/b[j-1]是LCS中的字符。
若dp[i][j]=dp[i][j-1],有a[i-1]≠b[j-1],也就是说 a[i-1]/b[j-1]不是LCS中的字符。
若dp[i][j]=dp[i-1][j],有a[i-1]≠b[j-1],同样 a[i-1]/b[j-1]不是LCS中的字符。;用一个字符串subs存放一个LCS,i=m,j=n开始向subs中添加k=dp[m][n]个字符,归纳为如下3种情况:
若dp[i][j]=dp[i-1][j](即当前dp元素值等于上方相邻元素值),移到上一行即i减1,此时a[i]/b[j]不是LCS字符。
若dp[i][j]=dp[i][j-1](即当前dp元素值等于左边相邻元素值),移到左一列即j减1,此时a[i]/b[j]不是LCS字符。
其他情况只能是dp[i][j]=dp[i-1][j-1]+1,移到左上方即i减1同时j减1,此时a[i]/b[j]是LCS的字符,将a[i]/b[j]添加到subs中。;例如,a=abcbdb,m=6,b=acbbabdbb,n=9。;1 defgetasubs(a,b): #由dp构造subs
2 subs= #存放一个LCS
3 m,n=len(a),len(b)
4 k=dp[m][n] #k为a和b的最长公共子序列长度
5 i,j=m,n
6 whilek0: #在subs中放入最长公共子序列(反向)
7 ifdp[i][j]==dp[i-1][j]:
8 i-=1
9 elifdp[i][j]==dp[i][j-1]:
10 j-=1
11 else:
12 subs+=a[i-1] #subs中添加a[i-1]
13 i,j,k=i-1,j-1,k-1
14 ans=list(subs)
15 ans.reverse()
16 return.join(ans) #返回逆置subs的字符串;设a和b是两个字符串。现在要用最少的字符操作次数(最优编辑距离),将字符串a编辑为字符串b。这里的字符编辑操作共有3种:删除一个字符,插入一个字符或者
您可能关注的文档
- 《算法设计与分析基础》(Python语言描述) 课程教学大纲(含思政).docx
- 《算法设计与分析基础》(Python语言描述) 实验教学大纲.docx
- 《算法设计与分析基础》(Python语言描述) 课件 第1章 绪论.pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第2章常用的数据结构及其应用(1).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第2章常用的数据结构及其应用(2).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第3章基本算法设计方法(1).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第3章基本算法设计方法(2).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第4章分治法(1).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第4章分治法(2).pptx
- 《算法设计与分析基础》(Python语言描述) 课件 第5章回溯法(1).pptx
文档评论(0)