动态规划模拟试卷及答案

合集下载

动态规划练习题(含答案)

动态规划练习题(含答案)

动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。

举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。

程序不能预存结果直接输出。

PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。

SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

动态规划练习试题和解答

动态规划练习试题和解答

动态规划练习题[题1] 多米诺骨牌(DOMINO)问题描述:有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。

现有一行排列在桌面上:顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。

顶行和底行的差值是2。

这个差值是两行点数之和的差的绝对值。

每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。

现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。

对于上面这个例子,我们只需翻转最后一个骨牌,就可以使得顶行和底行的差值为0,所以例子的答案为1。

输入格式:文件的第一行是一个整数n(1〈=n〈=1000〉,表示有n个多米诺骨牌在桌面上排成一行。

接下来共有n行,每行包含两个整数a、b(0〈=a、b〈=6,中间用空格分开〉。

第I+1行的a、b分别表示第I个多米诺骨牌的上部与下部的点数(0表示空)。

输出格式:只有一个整数在文件的第一行。

这个整数表示翻动骨牌的最少次数,从而使得顶行和底行的差值最小。

[题2] Perform巡回演出题目描述:Flute市的Phlharmoniker乐团2000年准备到Harp市做一次大型演出,本着普及古典音乐的目的,乐团指挥L.Y.M准备在到达Harp市之前先在周围一些小城市作一段时间的巡回演出,此后的几天里,音乐家们将每天搭乘一个航班从一个城市飞到另一个城市,最后才到达目的地Harp市(乐团可多次在同一城市演出).由于航线的费用和班次每天都在变,城市和城市之间都有一份循环的航班表,每一时间,每一方向,航班表循环的周期都可能不同.现要求寻找一张花费费用最小的演出表.输入: 输入文件包括若干个场景.每个场景的描述由一对整数n(2<=n<=10)和k(1<=k<=1000)开始,音乐家们要在这n个城市作巡回演出,城市用1..n标号,其中1是起点Flute市,n是终点Harp市,接下来有n*(n-1)份航班表,一份航班表一行,描述每对城市之间的航线和价格,第一组n-1份航班表对应从城市1到其他城市(2,3,...n)的航班,接下的n-1行是从城市2到其他城市(1,3,4...n)的航班,如此下去.每份航班又一个整数d(1<=d<=30)开始,表示航班表循环的周期,接下来的d个非负整数表示1,2...d天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.输出:对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.样例输入: 样例输出:3 6 4602 130 150 03 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 32 0 701 800 0[题3] 复制书稿(BOOKS)问题描述:假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。

动态规划讲解大全含例题及答案

动态规划讲解大全含例题及答案

动态规划讲解大全含例题及答案动态规划讲解大全动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。

动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。

例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。

虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。

动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。

不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。

动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。

因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。

我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。

基本模型多阶段决策过程的最优化问题。

在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。

动态规划专项练习题解

动态规划专项练习题解

另一种方法
• 将原串与原串的倒序做一次LCS—最长公 共子序列,用原串长度减去LCS长度,即 为需要插入字符的个数 • 例如:ab3bd与 db3ba • LCS(‘ab3bd’, ‘db3ba’)=‘b3b’ • 因此, ans=Len(‘ab3bd’)-Len(‘b3b’)=2
LCS的求法
• 最长公共子串(LCS),有三种情况: 1. 公共子串的元素必须相邻. 2. 公共子串的元素可以不相邻 3. 求多个字符串而不是两个字符串的最长公共 子串 • 动归4中,我们讲了求情况2的LCS序列。下面我们 来讨论情况1的做法。
• 任务:对于任意一个字符串,输出将这个字符串 变为回文串需要插入的最少字符个数,比如, ab3bd只需要插入2个字符就可以变为一个回文串. • 0<n<=1992,n为字符串长度。
分析
• ab3bd • 只需变为adb3bda即可,在前面插入d,在 后面插入a; • 我们分几种情况讨论:
– 若A形如 ?A?,(问号代表任意一个相同字符, 下同)则只需将A变为回文串。 – 若A形如?A再在A的后面插入一个”?” – 若A形如A ?再在A的前面插入一个”?”
分析
• 性质:青蛙遍历的路径不会相交。
• 上图中图2的路径比图1要短。 • 证明:图1: D1=d(1,3)+d(2,3)+d(2,4) 图2: D2=d(1,2)+d(2,3)+d(3,4) 要证明D1>D2,只要证明d(1,3) +d(2,4)>d(1,2)+d(3,4) 连接两边,见图3,由三角形的三边关系定理即可证明。
动态规划
• 设f(i,j)为将Ai..Aj变为回文串的最小代价,则
f (i 1, j 1), 若a[i] a[ j ] f (i, j ) min f (i 1, j ) 1, 若a[i] a[ j ],后插一个字符 f (i, j - 1) 1,若a[i] a[ j ],前插一个字符

动态规划试题

动态规划试题

动态规划试题动态规划装箱问题(01背包):有⼀个箱⼦容量为VV(正整数,0≤V≤20000),同时有n个物品(024 68 3 12 7 9 7输出:0f[j]=max(f[j],f[j-w[i]]+w[i]);f[j] 为:当总容量为j 时,不放第i 件物品,所能装的最⼤体积。

f[j-w[i]]+w[i] 为:当总容量为j 时,放了第i 件物品后,所能装的最⼤体积。

(即j减去第i 件物品体积的容量能装的最⼤体积+第i 件物品的体积。

w[i] 为第i 件物品体积)背包的种类:背包分为01背包,多重背包以及完全背包这三种基本模型,其他的背包问题都是从这3种背包中延申出来的。

完全背包的模板题⾯是这样的:设有n种物品,每种物品有⼀个重量及⼀个价值。

但每种物品的数量是⽆限的,同时有⼀个背包,最⼤载重量为M,今从n种物品中选取若⼲件(同⼀种物品可以⽆限选取),使其重量的和⼩于等于M,⽽价值的和为最⼤。

完全背包[⽆限量]的采摘药输⼊:70 371 10069 11 2输出:140每个数组在满⾜条件,可以遍历多次01背包实现代码:采药-传送门输⼊:70 371 10069 11 2输出:3每个数组遍历⼀遍题⽬描述⾦明今天很开⼼,家⾥购置的新房就要领钥匙了,新房⾥有⼀间他⾃⼰专⽤的很宽敞的房间。

更让他⾼兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就⾏”。

今天⼀早⾦明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。

于是,他把每件物品规定了⼀个重要度,分为5等:⽤整数1-5表⽰,第5等最重要。

他还从因特⽹上查到了每件物品的价格(都是整数元)。

他希望在不超过N元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最⼤。

设第jj件物品的价格为v_[j],重要度为w_[j],共选中了k件物品,编号依次为j_1,j_2,…,j_k,则所求的总和为:w_[j_k]v[j1]×w[j1]+v[j2]×w[j2]+…+v[jk]×w[jk]。

动态规划练习题

动态规划练习题

最小乘车费用 (bus)【问题描述】而任意一辆汽车从不行驶超过1 0公里。

某人想乘车到达n公里远的地方,假设他可以任意次换车,请你帮他找到一种乘车方案,使得总费用最小。

注意:1 0公里的费用比1公里小的情况是允许的。

【输入文件】共两行:第一行为1 0个不超过200的整数,依次表示行驶1~1 0公里的费用,相邻两数间用一个空格隔开:第二行为某人想要乘车的公里数(不超过20000的整数)。

【输出文件】仅一行,包含一个整数,表示到达n公里所需要的最小费用。

【样例输入】12 21 31 40 49 58 69 79 90 10115【样例输出】147船 (ships)【问题描述】PALMIA国家被一条河流分成南北两岸,南北两岸上各有N个村庄。

北岸的每一个村庄有一个唯一的朋友在南岸,且他们的朋友村庄彼此不同。

每一对朋友村庄想要一条船来连接他们,他们向政府提出申请以获得批准。

由于河面上常常有雾,政府决定禁止船只航线相交(如果相交,则很可能导致碰船)。

你的任务是编写一个程序,帮助政府官员决定批准哪些船只航线,使得不相交的航线数目最大。

【输入文件】ships.in输入文件由几组数据组成。

每组数据的第一行有2个整数X,Y,中间有一个空格隔开,X代表PALMIA河的长度(10<=X<=6000),Y代表河的宽度(10<=Y<=100)。

第二行包含整数N,表示分别坐落在南北两岸上的村庄的数目(1<=N<=5000)。

在接下来的N行中,每一行有两个非负整数C,D,由一个空格隔开,分别表示这一对朋友村庄沿河岸与PALMIA 河最西边界的距离(C代表北岸的村庄,D代表南岸的村庄),不存在同岸又同位置的村庄。

最后一组数据的下面仅有一行,是两个0,也被一空格隔开。

【输出文件】ships.out对输入文件的每一组数据,输出文件应在连续的行中表示出最大可能满足上述条件的航线的数目。

【输入样例】30 4722 42 610 315 129 817 174 20 0【输出样例】4DOLLARS (dollars)【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。

动态规划模拟试卷及答案

模拟试卷——第三章动态规划一、填空题(每小题4分,共20分)1、动态规划算法的基本要素是()和()。

2、()是动态规划法的变形。

3、()是最大子段和问题想二维的推广。

4、矩阵连乘问题的算法可由()设计实现。

5、动态规划算法中,通常不同子问题的个数随问题大小呈()增长。

二、简答题(每小题6分,共30分)1、写出设计动态规划算法的主要步骤。

2、简述什么是备忘录方法。

3、简述备忘录法与动态规划法的异同。

4、简述动态规划算法的基本思想。

5. 写出最长公共子序列问题具有的性质。

三、综合题(每小题25分,共50分)1、用动态规划算法实现最长公共子序列问题。

2、用动态规划算法实现下列问题:设A和B是两个字符串。

我们要用最少的字符操作将字符串A转换为字符串B,这里所说的字符操作包括:(1)删除一个字符;(2)插入一个字符;(3)将一个字符改为另一个字符。

将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。

试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。

答案一、填空题1、最优子结构、子问题重叠2、备忘录方法3、最大子矩阵的问题4、动态规划法5、多项式二、简答题1、(1)找出最优解的性质,并刻画其结构特征;(2)递归地定义最优解;(3)以自底向上的方法计算出最优值;(4)根据计算最优值时得到的信息,构造最优解。

2、备忘录方法是动态规划算法的变形。

备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

3、与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解此子问题时,只要简单地查看该子问题的解答,而不必重新计算。

与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。

4、动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

运筹学动态规划习题


二、某厂有100台机床,能够加工两种零件, 要安排4个月的任务,根据以往经验,用这 些机床加工第一种零件,一个月后损坏率 为1/3;加工第二种零件时,一个月后损坏 率为1/10。又已知机床加工第一种零件时一 个月的受益为10万元,机床加工第二种零 件时一个月的受益为7万元。现安排4个月 的任务,使总收益为最大。
• 首先建立动态规划的模型 • 划分成3个阶段,每个阶段决策一个项目 的投资额,每个阶段决策的投资时可以使 用的资金作为状态变量,利润为阶段的指 标函数。 • 利用基本递推方程从第3阶段开始求解 • 给企业的投资额为 95万元 在城市购买房 地产的投资额为 105万元 • 最大利润为 681万元

三、某公司有资金200万元,打算全部参与三 个方面的投资。(1)参与一个企业投资, 当投资额为X1(万元)时,可得利润为 J1=4X1-2(万元);(2)参与一个电视片 制作,当投资额为X2(万元)时,可得利 润为J2=1/16X2-1/5X2-2(万元);(3)在 城市购买房地产,当投资额为X3(万元) 时,可得利润为J3=3X3-10(万元)。又知 投资额的上限为X1≤95万元;X2≤50万元。 用动态规划法决策使总利润最大?
• 答案: • 设每个月为一个阶段,共4个阶段。每个阶 段可投入生产的机床数为状态变量SK,加 工第一种零件的机床数为决策变量UK,加 工第二种零件的机床数为SK-UK,阶段指标 函数为DK=7SK+3UK,SK+1=9/10SK-7/30UK。 用逆序的递推方法求解:前两月全部加工 第二种零件,后两月全部加工第一种零件。 其最大收益为2680
习题三
一、某工厂购进100台机器,准备生产A、B 两种产品。如生产产品A,每台机器每年可 收入45万元,损坏率为65%;若生产产品B, 每台机器每年可收入35万元,损坏率为 35%;估计三年后有新机器出现,旧的机 器将全部淘汰。试问每年应然后安排生产, 使在三年内收入最多?

动态规划习题答案

动态规划习题答案2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。

问怎样分配资金,使总效益值最大?##表8-47解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。

为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k?D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3?D3(S3)S4=S3-X3第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)} X2?D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)} X1?D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。

总收益164百万元。

3.(最优分配问题)有一个仪表公司打算向它的3个营业区设立6家销售店。

每个营业区至少设一家,所获利润如表。

问设立的6家销售店数应如何分配,可使总利润最大?解:s k——对k#,…,3#营业区允许设立的销售店数x k——对k#营业区设立的销售店数w k (s k,x k)——对k#营业区设立x k销售店后的利润:w k (s k,,x k)= w k (x k)T k (s k, x k)——s k +1= s k - x kf k (s k)——当第k至第3个营业区允许设立的销售店数为s k 时所能获得的最大利润递归方程:f4(s4)=0f k (s k)=max {wk (xk)+ fk+1(sk+1)}, k=3,2,1 xk?Dk(sk)k=3时,有方程f4 (s4)=0f3(s3)= max {w3(x3)+ f4(s4) }x3?D3(s3)s3=s2—x2k=2,有方程f2(s2)= max {w2(x2)+ f3(s3) }x2?D2(s2)s3=s2—x2k=1,有方程f1(s1)= max {w1(x1)+ f2(s2) }x1?D1(s1)s2=s1—x1s1=6 → s2=3 → s3=2↓↓↓x1*=3 x2*=1 x3*=2分别A1、A2、A3营业区设立3家、1家、2家销售店,最大利润为7704.用动态规划方法求解下列模型:maxf=10X1+4X2+5X3s.t. 3X1+5 X2+4 X3≤150≤X1≤2 0≤X2≤2 X3≥0 ,X j为整数j=1,2,3解:收费C1=10 C2=4 C3=5X1为货物1的装载件数X2为货物2的装载件数X3为货物3的装载件数分3阶段S1为货物1、2、3允许的装载重量(3X1+5 X2+4 X3的允许值)S2为货物2、3允许装载的重量(5 X2+4 X3的允许值)S3 为货物3允许装载的重量(4 X3的允许值)第一步:K=3f4(S4)=0f3(S3)= max{5X3+ f4(S4)| X3?D3(S3)}S4= S3 -4 X3第二步:K=2f2(S2)= max{4X2+ f3(S3)| X2?D2(S2)} S3= S2 -5 X2划分点:第三步:K=1f1(S3)= max{10X1+ f2(S2)| X1?D1(S1)} S2= S1-3 X110X1+ f2(S1-3 X1)顺序追踪:最优策略为S1=15 →S2=9 →S3=9↓↓↓X1*=2 X2*=0 X3*=2最优装载方案为:货物1装2件;货物2不装;货物3装2件装载收费为30元5.用动态规划方法解下列0—1背包问题:Max f =12x1+12x2+9x3+16x4+30x5;s.t. 3x1+4x2+3x3+4x4+6x5≤12;x j=0,1, j=1,……,5解:本问题分为5个阶段。

动态规划试题

1. 某公司打算向它的三个营业区增设6个销售店,每个营业区至少增设1个。

各营业区每年增加的利润与增设的销售店个数有关,具体关系如表1所示。

试规划各营业区应增设销售店的个数,以使公司总利润增加额最大。

表1解:将问题按区分为三个阶段3,2,1=k ,设状态变量k S (3,2,1=k )代表从第k 个区到第3个区的增设个数,决策变量k x 代表第k 个区的增设个数。

于是有状态转移率k k k x S S -=+1、允许决策集合}0|{)(k k k k k S x x S D ≤≤=和递推关系式:)}()({max )(10k k k k k S x k k x S f x g S f kk -+=+≤≤ )1,2,3(=k0)(44=S f当3=k 时:)}({max }0)({max )(330330333333x g x g S f S x S x ≤≤≤≤=+=于是有表7-2,表中*3x 表示第三个阶段的最优决策。

单位:百万元当2=k 时:)}()({max )(2232202222x S f x g S f S x -+=≤≤于是有表7-3。

表7-3 (单位:百万元)当1=k 时:)}()({max )(1121101111x S f x g S f S x -+=≤≤于是有表7-4。

故最优分配方案为:A 区建3个销售店,B 区建2个销售店,C 区建1个销售店, 总利润为490万元。

2. 某工厂有100台机器,拟分4个周期使用,在每一周期有两种生产任务,据经验把机器投入第一种生产任务,则在一个周期中将有六分之一的机器报废,投入第二种生产任务,则有十分之一的机器报废。

如果投入第一种生产任务每台机器可收益1万元,投入第二种生产任务每台机器可收益0.5万元。

问怎样分配机器在4个周期内的使用才能使总收益最大? 解:阶段:将每个周期作为一个阶段,即k=1,2,3,4 状态变量:第k 阶段的状态变量k S 代表第k 个周期初拥有的完好机器数决策变量:决策变量k x 为第k 周期分配与第一种任务的机器数量,于是k k x S -该周期分配在第二种任务的机器数量。

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

模拟试卷
——第三章动态规划
一、填空题(每小题4分,共20分)
1、动态规划算法的基本要素是()和()。

2、()是动态规划法的变形。

3、()是最大子段和问题想二维的推广。

4、矩阵连乘问题的算法可由()设计实现。

5、动态规划算法中,通常不同子问题的个数随问题大小呈()增长。

二、简答题(每小题6分,共30分)
1、写出设计动态规划算法的主要步骤。

2、简述什么是备忘录方法。

3、简述备忘录法与动态规划法的异同。

4、简述动态规划算法的基本思想。

5. 写出最长公共子序列问题具有的性质。

三、综合题(每小题25分,共50分)
1、用动态规划算法实现最长公共子序列问题。

2、用动态规划算法实现下列问题:设A和B是两个字符串。

我们要用最少的字
符操作将字符串A转换为字符串B,这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。

将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。

试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。

答案
一、填空题
1、最优子结构、子问题重叠
2、备忘录方法
3、最大子矩阵的问题
4、动态规划法
5、多项式
二、简答题
1、(1)找出最优解的性质,并刻画其结构特征;
(2)递归地定义最优解;
(3)以自底向上的方法计算出最优值;
(4)根据计算最优值时得到的信息,构造最优解。

2、备忘录方法是动态规划算法的变形。

备忘录方法的控制结构与直接递归方法
的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

3、与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下
次需要解此子问题时,只要简单地查看该子问题的解答,而不必重新计算。

与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。

4、动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

5、最长公共子序列问题具有最优子结构性质和子问题重叠性质。

三、综合题
1、解:用动态规划算法求解的算法代码如下:
int lcs_len(char*a,char*b,int c[][N])
{
int m=strlen(a),n=strlen(b),i,j;
for(i=0;i<=m;i++) c[i][0]=0;
for(j=1;j<=n;j++) c[0][j]=0;
for(i=1; i<=m;i++)
for(j=1;j<=n;j++)
if(a[i-1]= =b[j-1]) c[i][j]=c[i-1][j-1]+1;
else if(c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else c[i][j]=c[i][j-1];
return c[m][n];
};
char*build_lcs(char s[],char*a,char*b)
{
int k,i=strlen(a),j=strlen(b),c[N][N];
k=lcs_len(a,b,c);
s[k]=’/0’;
while(k>0){
if(c[i][j]= =c[i-1][j])i--;
else if(c[i][j]= =c[i][j-1])j--;
else{
s[--k]=a[i-1];
i--,j--;
}
}
return s;
}
2、解:用动态规划算法求解的算法代码如下:
int dist()
{
int m=a,size();
int n=b,size();
vector<int>d(n+1,0);
for(int i=1;i<=n;i++) d[i]=i;
for(i=1;i<=m;i++){
int y=i-1;
for(int j=1;j<=n;j++){
int x=y;
y=d[j];
int z=j>1?d[j-1]:i;
int del=a[i-1]= =b[j-1]?0:1;
d[j]=min(x+del,y+1,z+1);
}
}
return d[n];
}。

相关文档
最新文档