动态规划算法资料讲解

合集下载

动态规划算法难点详解及应用技巧介绍

动态规划算法难点详解及应用技巧介绍

动态规划算法难点详解及应用技巧介绍动态规划算法(Dynamic Programming)是一种常用的算法思想,主要用于解决具有重叠子问题和最优子结构性质的问题。

在解决一些复杂的问题时,动态规划算法可以将问题分解成若干个子问题,并通过求解子问题的最优解来求解原始问题的最优解。

本文将详细介绍动态规划算法的难点以及应用技巧。

一、动态规划算法的难点1. 难点一:状态的定义在动态规划算法中,首先需要明确问题的状态。

状态是指问题在某一阶段的具体表现形式。

在进行状态定义时,需要考虑到问题的最优子结构性质。

状态的定义直接影响到问题的子问题划分和状态转移方程的建立。

2. 难点二:状态转移方程的建立动态规划算法是基于状态转移的思想,即通过求解子问题的最优解来求解原始问题的最优解。

因此,建立合理的状态转移方程是动态规划算法的关键。

在进行状态转移方程的建立时,需要考虑问题的最优子结构性质和状态之间的关系。

3. 难点三:边界条件的处理在动态规划算法中,边界条件是指问题的最简单情况,用于终止递归过程并给出递归基。

边界条件的处理需要考虑问题的具体要求和实际情况,确保问题能够得到正确的解。

二、动态规划算法的应用技巧1. 应用技巧一:最长递增子序列最长递增子序列是一类经典的动态规划问题。

其求解思路是通过定义状态和建立状态转移方程,找到问题的最优解。

在应用最长递增子序列问题时,可以使用一维数组来存储状态和记录中间结果,通过迭代计算来求解最优解。

2. 应用技巧二:背包问题背包问题是另一类常见的动态规划问题。

其求解思路是通过定义状态和建立状态转移方程,将问题转化为子问题的最优解。

在应用背包问题时,可以使用二维数组来存储状态和记录中间结果,通过迭代计算来求解最优解。

3. 应用技巧三:最短路径问题最短路径问题是动态规划算法的经典应用之一。

其求解思路是通过定义状态和建立状态转移方程,利用动态规划的思想来求解最优解。

在应用最短路径问题时,可以使用二维数组来存储状态和记录中间结果,通过迭代计算来求解最优解。

动态规划算法入门

动态规划算法入门

动态规划算法⼊门1. 动态规划算法定义:动态规划,英⽂描述为Dynamic programming. 是⼀种可以把原始问题分解为若⼲相关联的⼦解问题,并通过求取和保存⼦问题的解,获得原问题的解。

动态规划算法可以解决的问题通常包含如下特征:重叠⼦问题最优⼦结构 对于第⼀个特征,⽐较容易理解,即分解的若⼲⼦问题,包含着重复的解。

举例如:斐波那契数列,F(n) = F(n-1) + F(n-2),求解的F(n-1)的过程中,包含着求解F(n-2)的结果。

对于第⼆个特征,参考⽹上的说法为:假设当前决策结果是f[n],则最优⼦结构就是要让f[n-k]最优,最优⼦结构性质就是能让转移到n的状态是最优的,并且与后⾯的决策没有关系,即让后⾯的决策安⼼地使⽤前⾯的局部最优解的⼀种性质。

关键字解读为:当前的决策与后⾯的决策是⽆关的, f[n-k]是最优的,转移到f[n]的状态是最优的2. 动态规划算法的⼀般步骤和难点使⽤动态规划算法解决问题的⼀般步骤是:找到问题的最优解的性质,⽤数学公式或者算法描述拆解⼦问题,确定问题的递推结构,保证可以收敛。

⽤知乎⼤神们的总结就是:找到问题的状态描述和状态转移⽅程。

3. 动态规划算法的分类和理解根据我的理解,以及⽹上的说法,我把动态规划算法分为三个类别和层次:简单动态规划算法,即状态⽅程是⽤⼀个维度的变量的描述的,常见的问题如:斐波那契数列,爬台阶问题等 爬台阶问题问题描述:有⼀座⾼度是10级台阶的楼梯,从下往上⾛,每跨⼀步只能向上1级或者2级台阶。

要求⽤程序来求出⼀共有多少种⾛法。

状态描述:我们使⽤变量n表⽰台阶的级数,F(n)表⽰n级台阶⼀共有多少种⾛法 状态转移⽅程与问题分解:根据每次能跨越的台阶数⽬:1级台阶或者2级台阶,因为⾛到N级台阶之前,⼈⼀定是处于N-1级台阶或者N-2级台阶。

F(n)的⾛法,⼀定是n-1级别的台阶的所有的⾛法和n-2级别台阶的所有⾛法之和。

F(n) = F(n-1) + F(n-2); 关于状态的分解,更详细的说明,可以看这篇⽂章:。

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例

动态规划算法的详细原理及使用案例一、引言动态规划是一种求解最优化问题的算法,它具有广泛的应用领域,如机器学习、图像处理、自然语言处理等。

本文将详细介绍动态规划算法的原理,并提供一些使用案例,以帮助读者理解和应用这一算法的具体过程。

二、动态规划的基本原理动态规划算法通过将问题分解为多个子问题,并利用已解决子问题的解来求解更大规模的问题。

其核心思想是利用存储技术来避免重复计算,从而大大提高计算效率。

具体来说,动态规划算法通常包含以下步骤:1. 定义子问题:将原问题分解为若干个子问题,这些子问题具有相同的结构,但规模更小。

这种分解可以通过递归的方式进行。

2. 定义状态:确定每个子问题的独立变量,即问题的状态。

状态具有明确的定义和可计算的表达式。

3. 确定状态转移方程:根据子问题之间的关系,建立状态之间的转移方程。

这个方程可以是简单的递推关系式、递归方程或其他形式的方程。

4. 解决问题:使用递推或其他方法,根据状态转移方程求解每个子问题,直到获得最终解。

三、动态规划的使用案例1. 背包问题背包问题是动态规划算法的经典案例之一。

假设有一个背包,它能容纳一定重量的物品,每个物品有对应的价值。

目的是在不超过背包总重量的前提下,选取最有价值的物品装入背包。

这个问题可以通过动态规划算法来求解。

具体步骤如下:(1)定义问题:在不超过背包容量的限制下,选取物品使得总价值最大化。

(2)定义状态:令dp[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。

(3)状态转移方程:dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]),其中w[i]为第i个物品的重量,v[i]为第i个物品的价值。

(4)解决问题:根据状态转移方程依次计算每个子问题的解,并记录最优解,直到获得最终答案。

2. 最长公共子序列最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的动态规划问题,它用于确定两个字符串中最长的共同子序列。

动态规划算法原理与的应用

动态规划算法原理与的应用

动态规划算法原理与的应用动态规划算法是一种用于求解最优化问题的常用算法。

它通过将原问题划分为子问题,并将每个子问题的解保存起来,以避免重复计算,从而降低了问题的时间复杂度。

动态规划算法的核心思想是自底向上地构建解,以达到求解整个问题的目的。

下面将介绍动态规划算法的原理以及一些常见的应用。

1.动态规划算法的原理1)将原问题划分为多个子问题。

2)确定状态转移方程,即找到子问题之间的关系,以便求解子问题。

3)解决子问题,并将每个子问题的解保存起来。

4)根据子问题的解,构建整个问题的解。

2.动态规划算法的应用2.1最长公共子序列1) 定义状态:假设dp[i][j]表示序列A的前i个字符和序列B的前j个字符的最长公共子序列的长度。

2) 确定状态转移方程:若A[i] == B[j],则dp[i][j] = dp[i-1][j-1] + 1;若A[i] != B[j],则dp[i][j] = max(dp[i-1][j],dp[i][j-1])。

3) 解决子问题:从前往后计算dp数组中每个元素的值。

4) 构建整个问题的解:dp[m][n]即为最终的最长公共子序列的长度,其中m和n分别为序列A和序列B的长度。

2.2背包问题背包问题是指给定一个背包的容量和一些物品的重量和价值,要求在不超过背包容量的情况下,选择若干物品放入背包中,使得背包中物品的总价值最大。

该问题可通过动态规划算法求解,具体步骤如下:1) 定义状态:假设dp[i][j]表示在前i个物品中选择若干物品放入容量为j的背包中,能够获得的最大价值。

2) 确定状态转移方程:考虑第i个物品,若将其放入背包,则dp[i][j] = dp[i-1][j-wi] + vi;若不将其放入背包,则dp[i][j] = dp[i-1][j]。

3) 解决子问题:从前往后计算dp数组中每个元素的值。

4) 构建整个问题的解:dp[n][C]即为最终的背包能够获得的最大价值,其中n为物品的个数,C为背包的容量。

动态规划算法原理及应用

动态规划算法原理及应用

动态规划算法原理及应用动态规划算法(Dynamic Programming,DP)是一种通过将问题分解为子问题来解决复杂问题的方法。

其核心思想就是将原问题分解为若干个子问题,先求解子问题,然后再根据子问题的解得出原问题的解。

1.定义子问题:将原问题分解为若干个子问题,每个子问题都是原问题的一个子集。

2.构建状态转移方程:根据子问题的关系,建立状态转移方程来描述问题的解。

3.确定边界条件:确定问题的边界条件,即当问题规模很小的时候可以直接求解的情况。

4.自底向上求解:根据状态转移方程,自底向上地求解子问题,最终得到原问题的解。

1.背包问题:给定一个背包的容量和一系列物品的重量和价值,选择若干个物品放入背包中,使得背包的总重量不超过容量,同时总价值最大化。

2.最长公共子序列(LCS)问题:给定两个字符串,求它们的最长公共子序列,即两个字符串中都出现的最长的子序列。

3.最短路径问题:给定一个有向带权图和两个顶点,求两个顶点之间的最短路径。

4.最大连续子序列和问题:给定一个整数数组,找到一个具有最大和的连续子序列。

5.斐波那契数列:求解斐波那契数列中第n个数的值。

其中,斐波那契数列的定义为:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),n>11.避免了重复计算:动态规划算法使用备忘录或者数组来存储中间计算结果,避免了重复计算,提高了效率。

2.自底向上求解:动态规划算法从最小的子问题开始求解,逐步拓展到原问题,保证了每个子问题都是已经求解过的。

3.可通过状态压缩进行优化:动态规划算法中,可以根据具体问题的特点,通过状态压缩来减少空间复杂度。

然而,动态规划算法也有一些限制:1.无法应用于所有问题:动态规划算法要求问题满足最优子结构的性质,因此不是所有问题都可以使用动态规划算法来解决。

2.有时需要额外的空间和时间:动态规划算法可能需要使用额外的空间来存储中间结果,同时也需要额外的时间来计算和存储中间结果。

动态规划算法详解及经典例题

动态规划算法详解及经典例题

动态规划算法详解及经典例题⼀、基本概念(1)⼀种使⽤多阶段决策过程最优的通⽤⽅法。

(2)动态规划过程是:每次决策依赖于当前状态,⼜随即引起状态的转移。

⼀个决策序列就是在变化的状态中产⽣出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

假设问题是由交叠的⼦问题所构成,我们就能够⽤动态规划技术来解决它。

⼀般来说,这种⼦问题出⾃对给定问题求解的递推关系中,这个递推关系包括了同样问题的更⼩⼦问题的解。

动态规划法建议,与其对交叠⼦问题⼀次重新的求解,不如把每⼀个较⼩⼦问题仅仅求解⼀次并把结果记录在表中(动态规划也是空间换时间的)。

这样就能够从表中得到原始问题的解。

(3)动态规划经常常使⽤于解决最优化问题,这些问题多表现为多阶段决策。

关于多阶段决策:在实际中,⼈们经常遇到这样⼀类决策问题,即因为过程的特殊性,能够将决策的全过程根据时间或空间划分若⼲个联系的阶段。

⽽在各阶段中。

⼈们都须要作出⽅案的选择。

我们称之为决策。

⽽且当⼀个阶段的决策之后,经常影响到下⼀个阶段的决策,从⽽影响整个过程的活动。

这样,各个阶段所确定的决策就构成⼀个决策序列,常称之为策略。

因为各个阶段可供选择的决策往往不⽌⼀个。

因⽽就可能有很多决策以供选择,这些可供选择的策略构成⼀个集合,我们称之为同意策略集合(简称策略集合)。

每⼀个策略都对应地确定⼀种活动的效果。

我们假定这个效果能够⽤数量来衡量。

因为不同的策略经常导致不同的效果,因此,怎样在同意策略集合中选择⼀个策略,使其在预定的标准下达到最好的效果。

经常是⼈们所关⼼的问题。

我们称这种策略为最优策略,这类问题就称为多阶段决策问题。

(4)多阶段决策问题举例:机器负荷分配问题某种机器能够在⾼低两种不同的负荷下进⾏⽣产。

在⾼负荷下⽣产时。

产品的年产量g和投⼊⽣产的机器数量x的关系为g=g(x),这时的年完善率为a,即假设年初完善机器数为x,到年终时完善的机器数为a*x(0<a<1);在低负荷下⽣产时,产品的年产量h和投⼊⽣产的机器数量y 的关系为h=h(y)。

动态规划算法教学PPT

动态规划算法教学PPT

03
动态规划算法的实现步骤
明确问题,建立数学模型
1
确定问题的目标和约束条件,将其转化为数学模 型。
2
理解问题的阶段划分,将问题分解为若干个子问 题。
3
确定状态变量和决策变量,以便描述子问题的状 态和决策。
划分阶段,确定状态变量和决策变量
01
根据问题的阶段划分,将问题分解为若干个子问题。
02
确定状态变量和决策变量,以便描述子问题的状态 和决策。
02
将子问题的最优解组合起来,得到原问题的最优解。
对最优解进行验证和性能评估,确保其满足问题的要求。
03
04
动态规划算法的优化技巧
分支定界法
分支定界法是一种求解优化问题的算 法,它通过不断生成问题的分支并确 定每个分支的界限,来寻找最优解。 在动态规划中,分支定界法可以用来 优化状态转移方程,减少计算量。
详细描述
多目标规划问题在实际生活中应用广泛,如资源分配、项目计划、城市规划等领 域都有涉及。常用的求解多目标规划的方法包括权重和法、帕累托最优解等。
多阶段决策问题
总结词
多阶段决策问题是动态规划中的一类,解决的问题需要在多个阶段做出决策,每个阶段的决策都会影响到后续阶 段的决策。
详细描述
多阶段决策问题在实际生活中应用广泛,如生产计划、库存管理、路径规划等领域都有涉及。常用的求解多阶段 决策问题的方法包括递归法、动态规划等。
特点
动态规划算法具有最优子结构、重叠 子问题和最优解性质等特征。
动态规划算法的应用领域
计算机科学
在计算机科学中,动态规划算法广泛应用于字符 串处理、排序、数据压缩和机器学习等领域。
电子工程
在电子工程中,动态规划算法用于信号处理、通 信和控制系统等领域。

动态规划典型案例解析及计算过程梳理

动态规划典型案例解析及计算过程梳理

动态规划典型案例解析及计算过程梳理动态规划(Dynamic Programming)是一种通过将问题分解为子问题来解决复杂问题的算法策略。

它通常用于优化问题,通过将问题的解决方案划分为相互重叠的子问题来降低计算复杂度。

下面将通过几个典型案例,详细解析动态规划的应用及其计算过程。

1. 斐波那契数列斐波那契数列是一种经典的动态规划问题。

它的定义是:F(n) =F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。

我们需要计算第n个斐波那契数。

通过动态规划的思想,可以将该问题划分为子问题,即计算第n-1和第n-2个斐波那契数。

可以使用一个数组来保存已经计算过的斐波那契数,避免重复计算。

具体的计算过程如下:1. 初始化一个长度为n+1的数组fib,将fib[0]设置为0,fib[1]设置为1。

2. 从i=2开始遍历到n,对于每个i,计算fib[i] = fib[i-1] + fib[i-2]。

3. 返回fib[n]作为结果。

通过上述过程,我们可以快速地得到第n个斐波那契数。

这个案例展示了动态规划的重要特性,即将问题分解为子问题进行求解,并利用已经计算过的结果来避免重复计算。

2. 背包问题背包问题是另一个常见的动态规划问题。

问题的定义是:有一组物品,每个物品有自己的重量和价值,在限定的背包容量下,如何选择物品使得背包中的总价值最大化。

通过动态规划的思想,背包问题可以被划分为子问题。

我们可以定义一个二维数组dp,其中dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。

具体的计算过程如下:1. 初始化一个大小为n+1行,m+1列的二维数组dp,其中n为物品数量,m为背包容量。

将所有元素初始化为0。

2. 从i=1开始遍历到n,对于每个i,从j=1开始遍历到m,对于每个j,进行如下判断:- 若当前物品的重量大于背包容量j,则dp[i][j] = dp[i-1][j],即不选择当前物品;- 若当前物品的重量小于等于背包容量j,则dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi),即选择当前物品或不选择当前物品所能获得的最大价值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
2020/6/14
4
Fibonacci sequence(序列)
蛮力法: 列举A所以的2n个子序列, 对于每一子序 列在(m)时间内来确定它是否也是B的子序列.
很明显, 此算法的时间复杂的为(m*2n).
2020/6/14
10
ห้องสมุดไป่ตู้推公式
为了使用动态规划技术, 首先推导一个求最长公 共子序列长度的递推公式. 令A=a1a2...an和B=b1b2...bm 令L[i, j]表示a1a2...ai和b1b2...bj的最长公共子 序列的长度(i, j可能是0, 此时a1a2...ai和 b1b2...bj中至少一个为空). 可得如下结论:
对于给定的一对索引i和j, 1i<jn, Mi,j可用如 下方法计算:
设k是i+1和j之间的一个索引, 计算两个矩阵 Mi,k-1=MiMi+1…Mk-1和Mk,j=MkMk+1…Mj, 那么 Mi,j=Mi,k-1Mk,j
显然, 用这种方法计算Mi,j的总耗费, 是计算Mi,k-1的 耗费加上计算Mk,j的耗费, 再加上Mi,k-1乘以Mk,j的耗 费(rirkrj+1), 因此得到了如下的公式:
7y 0 1 2 2 3 3 3 4 4 5 5 5 5
8z 0 1 2 3 3 3 4 4 4 5 5 5 6
9x 0 1 2 3 3 3 4 5 5 5 6 6 6
10y 0 1 2 3 4 4 4 5 5 6 6 6 6
2020/6/14
图7.1 最长公共子序列问题的一个例子
17
Algorithm 7.1pro LCS 1. for i0 to n 2. L[i, 0]0 3. end for 4. for j0 to m 5. L[0, j]0 6. end for 7. for i1 to n 8. for j1 to m 9. if ai=bj then L[i, j]L[i-1, j-1]+1, b[i, j]”\”
2020/6/14
13
Algorithm 7.1 LCS Input: Two strings A and B of length n and m, respectively, over an alphabet
Output: The length of the longest common subsequence of A and B
((AB)(CD))
乘法次数: 36000
(((AB)C)D)
乘法次数: 87500
((A(BC))D)
乘法次数: 34500
2020/6/14
24
Matrix chain multiplication矩阵链相乘
一般情况下, n个矩阵链M1M2...Mn相乘的耗费, 取 决于n-1个乘法执行的顺序(结合方式).
2020/6/14
6
Fibonacci sequence分析
f(n)= f(n-1)+ f(n-2)
=2f(n-2)+ f(n-3)
=3f(n-3)+2f(n-4)
=5f(n-4)+3f(n-5)
T(n) 1T(n1)T(n2)
if n1,2 if n3
f (n)(n),where1 5
2
2020/6/14
15
定理7.1 最长公共子序列问题的 最优解能够在(nm)时间和 (min{m, n}) 空间内得到.

2020/6/14
16
A=“xyxxzxyzxy” B=“zxzyyzxxyxxz”
0 1z 2x 3z 4y 5y 6z 7x 8x 9y 10x 11x 12z
0 00 0 0 0 0 0 0 0 0 0 0 0
1. for i0 to n 2. L[i, 0]0 3. end for 4. for j0 to m 5. L[0, j]0 6. end for
2020/6/14
14
7. for i1 to n 8. for j1 to m 9. if ai=bj then L[i, j]L[i-1, j-1]+1 10. else L[i, j]max{L[i, j-1], L[i-1, j]} 11. end if 12. end for 13. end for 14. return L[n, m]
如果采用自顶向下的方式不能得到有效的算法, 导致巨大的重复递归调用.
2020/6/14
27
Illustration of matrix chain multiplication矩阵链乘图示
2020/6/14
28
Algorithm 7.2 MATCHAIN
Input: An array r[1..n+1] of positive integers corresponding to the dimensions of a chain of n matrices, where r[1..n] are the number of rows in the n matrices and r[n+1] is the number of columns in Mn
2020/6/14
20
2020/6/14
21
算法的改进
在算法lcs和print-LCS中, 可进一步将数组b省 去. 事实上, 数组元素L[i][j]的值仅由L[i-1][j-1], L[i-1][j]和L[i][j-1]这3个数组元素的值所确定. 对于给定的数组元素L[i][j], 可以不借助于数组 b而仅借助于L本身确定L[i][j]的值是由L[i1][j-1], L[i-1][j]和L[i][j-1]中哪一个值所确定的.
和前面的方法相比, 可以很大程度降低时间复杂 度.
2020/6/14
9
The longest common subsequence problem最长公共子序列问题
在字母表上, 分别给出两个长度为n和m的字符 串A和B, 确定在A和B中最长公共子序列的长度.
这符里串A, 其=a中1a每2...个ani的j在子1到序n列之的间一, 个并形且式1为i1<aii21<a.i.2..<..iakik的n 字
ma L[ix ,j {1]L ,[i1,j]}ifi0,j0anaid bj
2020/6/14
12
现在可以直接用动态规划技术来求解最长 公共子序列问题。对每一对i和j的值,0 i n,0 j m,我们用一个(n+1)×(m+1) 表来计算L[i, j]的值,只需要用上面的公式 逐行地填表L[0…n, 0…m]。算法如下:
2020/6/14
23
Matrix chain multiplication矩阵链相乘
设有4个矩阵A, B, C, D, 它们的维数分别是 A:5010 B:1040 C:4030 D:305, 共有5种加括号 的方式:
(A((BC)D))
乘法次数: 16000
(A(B(CD)))
乘法次数: 10500
2020/6/14
7
二项式系数的计算
1
n k
n k
1 1
n k
1
n k
n! k!(n
k )!
由 Stirling 等式,有
if k 0 or k n if 0 k n
n k
n! (( n / 2 )! ) 2
2nn n / en n(n / 2)n / en
2n n
有效计算上式的方法是按行构造帕斯卡三角形
2020/6/14
26
C [ i,j] m i k j{ C [ i,k n 1 ] C [k ,j] r ir k r j 1 }
Particularly,
C [ 1 ,n ] 1 m k n { C [ 1 , ik n 1 ] C [ k ,n ] r 1 r k r n 1 }
Fibonacci序列定义如下:
1. procedure f(n)
2. if n=1 or n=2 then return 1
3. else return f(n-1)+f(n-2)
这种递归形式有简洁、容易书写和容易查错等 优点, 最主要是它的抽象性.
但是它远不是有效的算法.
算法复杂性: (n) Why???
蛮力算法: 计算出每一种可能顺序的数量乘法次 数.
时间复杂度是:
算法复杂度分析: 对于n个矩阵的连乘积, 设其不同的计算次序为P(n). 由于每种加括号方式都可以分解为两个子矩阵的加括号问题: (A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下:
P (n ) n 1P (k)1 P (nk) k 1
1x 0 0 1 1 1 1 1 1 1 1 1 1 1
2y 0 0 1 1 2 2 2 2 2 2 2 2 2
3x 0 0 1 1 2 2 2 3 3 3 3 3 3
4x 0 0 1 1 2 2 2 3 4 4 4 4 4
5z 0 1 1 2 2 2 3 3 4 4 4 4 5
6x 0 1 2 2 2 2 3 4 4 4 5 5 5
19. return L[n, m] and b[n, m]
2020/6/14
19
print-LCS(b, A, i, j) 1. if i=0 or j=0 then return 2. if b[i, j]= ”\” then 3. print-LCS(b, A, i-1, j-1) 4. print ai 5. else 6. if b[i, j]= ”” then print-LCS(b, A, i-1, j) 7. else print-LCS(b, A, i, j-1) 8. end if
相关文档
最新文档