动态规划模拟试卷及答案

合集下载

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

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

动态规划练习题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 -该周期分配在第二种任务的机器数量。

最新动态规划习题答案

最新动态规划习题答案

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个阶段。

动态规划模拟题带分析和程序

动态规划模拟题带分析和程序

积木城堡(Vijos P1059)描述DescriptionXC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡。

城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木。

小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大,那么城堡便不容易倒。

所以他在垒城堡的时候总是遵循这样的规则。

小XC想把自己垒的城堡送给幼儿园里漂亮的女孩子们,这样可以增加他的好感度。

为了公平起见,他决定把送给每个女孩子一样高的城堡,这样可以避免女孩子们为了获得更漂亮的城堡而引起争执。

可是他发现自己在垒城堡的时候并没有预先考虑到这一点。

所以他现在要改造城堡。

由于他没有多余的积木了,他灵机一动,想出了一个巧妙的改造方案。

他决定从每一个城堡中挪去一些积木,使得最终每座城堡都一样高。

为了使他的城堡更雄伟,他觉得应该使最后的城堡都尽可能的高。

任务:请你帮助小XC编一个程序,根据他垒的所有城堡的信息,决定应该移去哪些积木才能获得最佳的效果。

输入格式Input Format第一行是一个整数N(N<=100),表示一共有几座城堡。

以下N行每行是一系列非负整数,用一个空格分隔,按从下往上的顺序依次给出一座城堡中所有积木的棱长。

用-1结束。

一座城堡中的积木不超过100块,每块积木的棱长不超过100。

输出格式Output Format一个整数,表示最后城堡的最大可能的高度。

如果找不到合适的方案,则输出0。

样例输入Sample Input22 1 –13 2 1 –1样例输出Sample Output3算法分析:背包问题,动态规划。

用BOOLEAN类型的数组f[i][j] 表示取自前i 个积木能否堆到高度j 。

边界条件是:f[i][0] = 0,取自前i 个积木堆到高度为0 ,一定不成功。

f[i][w[i]] = 1,取自前i 个积木堆到高度为w[i] ,一定成功。

GF描述Description"找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊..."七夕...七夕...七夕这个日子,对于sqybi这种单身的菜鸟来说是多么的痛苦...虽然他听着这首叫做"找啊找啊找GF"的歌,他还是很痛苦.为了避免这种痛苦,sqybi决定要给自己找点事情干.他去找到了七夕模拟赛的负责人zmc MM,让她给自己一个出题的任务.经过几天的死缠烂打,zmc MM终于同意了.但是,拿到这个任务的sqybi发现,原来出题比单身更让人感到无聊-_-....所以,他决定了,要在出题的同时去办另一件能够使自己不无聊的事情--给自己找GF.sqybi现在看中了n个MM,我们不妨把她们编号1到n.请MM吃饭是要花钱的,我们假设请i号MM吃饭要花rmb[i]块大洋.而希望骗MM当自己GF是要费人品的,我们假设请第i号MM吃饭试图让她当自己GF的行为(不妨称作泡该MM)要耗费rp[i]的人品.而对于每一个MM来说,sqybi都有一个对应的搞定她的时间,对于第i个MM来说叫做time[i]. sqybi保证自己有足够的魅力用time[i]的时间搞定第i个MM^_^.sqybi希望搞到尽量多的MM当自己的GF,这点是毋庸置疑的.但他不希望为此花费太多的时间(毕竟七夕赛的题目还没出),所以他希望在保证搞到MM数量最多的情况下花费的总时间最少.sqybi现在有m块大洋,他也通过一段时间的努力攒到了r的人品(这次为模拟赛出题也攒rp哦~~).他凭借这些大洋和人品可以泡到一些MM.他想知道,自己泡到最多的MM花费的最少时间是多少.注意sqybi在一个时刻只能去泡一个MM--如果同时泡两个或以上的MM的话,她们会打起来的...输入格式Input Format输入的第一行是n,表示sqybi看中的MM数量.接下来有n行,依次表示编号为1, 2, 3, ..., n的一个MM的信息.每行表示一个MM的信息,有三个整数:rmb, rp和time.最后一行有两个整数,分别为m和r.输出格式Output Format你只需要输出一行,其中有一个整数,表示sqybi在保证MM数量的情况下花费的最少总时间是多少.样例输入Sample Input41 2 52 1 62 2 22 2 35 5样例输出Sample Output13这一题其实就是一个很简单的二维背包问题。

动态规划 练习题

动态规划  练习题

23.(11分)请用动态规划逆序求解法求解下列问题:求出下图中从A到E的最短路线及长度。

在图中标出每个点到终点的最短距离。

24. (11分)一个旅行者从A点出发,经过B、C、D等处,到达E。

各地间距离如图中所示。

问该旅行者应选择哪一条路线,使从A到E的总路程最短?(可直接在图上标号,最后给定答案)
24.一个旅行者从A点出发,经过B、C、D等处,到达E。

各地间距离如图中所示。

问该旅行者应选择哪一条路线,使从A到E的总路程最短?(可直接在图上标号,最后给定答案)(11分)
解:此为动态规划之“最短路问题”,可用逆向追踪“图上标号法”解决如下:
最佳策略为:A →B 2→C 1→D 1→E 或A →B 3→C 1→D 1→E 此时从A 到E 的总路程的最短距离都是11
23. 请用动态规划逆序求解法求解下列问题:
各点标号依次为:A:8, B1:7,B2:6, B3:8, C1:5, C2:4,D1:3,D2:1,D3:5.
25. 某厂生产C B A ,,三种产品,其所需劳动力、材料等有关数据见下表。

要求:建立模型,并用单纯形法计算,确定获利最大的产品生产计划。

解:(1)设C B A ,,
各生产321,,x x x 件。


32143min x x x z ++=
st.⎪⎩⎪
⎨⎧=≥≤++≤++)3,2,1(,03054345
536321321j x x x x x x x j
(4分)
获利最大的生产计划是C B A ,,各生产5件、0件、3件,最大利润为273453=⨯+⨯=z 元。

(15分)。

运筹学 动态规划-作业及答案

运筹学 动态规划-作业及答案

1
第五章 动态规划作业题及答案
1.用动态规划法求解求最短路径
从起点A 到终点E 之间各点的距离如图所示。

求A 到E 的最短路径。

B A
C B
D B C D E
C 21
23
12
31
2
5
11214
10610
41312113
96
5810
5
2
2.用动态规划法求解资源分配问题
有资金4万元,投资A 、B 、C 三个项目,每个项目的投资效益与投入该项目的资金有关。

三个项目A 、B 、C 的投资效益(万吨)和投入资金(万元)的关系见下表:
用动态规划法求解对三个项目的最优投资分配,使总投资效益最大。

3.用动态规划法求解生产库存问题
一个工厂生产某种产品,1~7月份生产成本和产品需求量的变化情况如下表:
为了调节生产生产和需求,工厂设有一个产品仓库,库容量H=9。

已知期初库存量为2,要求期末(七月低)库存量为0。

每个月生产的产品在月末入库,月初根据当月需求发货。

求七个月的生产量,能满足各月的需求,并使生产成本最低。

4.用动态规划法求解背包问题
第i 种每件价值c 1=65,c 2=85,c 3=40元; 第i 种物品每件重量为:w 1=2,w 2=3,w 3=1公斤;现有一只可装载重量为5公斤的背包,求各种物品应各取多少件放入背包,使背包中物品的价值最高。

动态规划练习解答

动态规划练习解答

Var a:array[1..1000000] of longint; c,p:array[1..100] of longint; k,n,tmp,s,min,i:longint; begin assign(input,'panda.in'); assign(output,'panda.out'); reset(input); rewrite(output); readln(k, n); inc(n); for i:=1 to k do read(c[i]); i-1; end; for i:=1 to n do if k[i]>0 then writeln(i,' ',k[i]); close(input); close(output); end.
2、最小乘车费用(work.pas) 、最小乘车费用( ) 假设某条街上每一公里就有一个公共汽车站, 假设某条街上每一公里就有一个公共汽车站,并 且乘车费用如下表: 且乘车费用如下表:
For i:=1 to 10 do read(a[i]); readln(n); fillchar(b,sizeof(b),0); for i:=1 to n do begin max:=maxlongint; for j:=1 to 10 do if (i-j>=0) and (a[j]+b[i-j]<max) then max:=a[j]+b[i-j]; b[i]:=max; end; writeln(b[n]); close(input); close(output); end.
输入: 输入:panda.in 行有2个数 代表质因数的个数, 代表那个宇宙系数 第1行有 个数 行有 个数n,k,n代表质因数的个数,k代表那个宇宙系数 代表质因数的个数 (1<=n<=100,1<=k<=1e5) ) 行有n个数 个质因数。(每个均小于1000,且 第2行有 个数,代表这 个质因数。(每个均小于 行有 个数,代表这n个质因数。(每个均小于 , 不相同) 不相同) 输出: 输出:panda.out 个质因数的数中第k小的数 仅1行,即至多只包含这 个质因数的数中第 小的数。 行 即至多只包含这n个质因数的数中第 小的数。 这个数不会超过2e9) (这个数不会超过 ) 输入样例 27 35 输出样例 45(前6个分别是 个分别是3,5,9,15,25,27) ( 个分别是 )

动态规划试题

动态规划试题

能量项链本题是一道很经典的dp题目,其实质就是“石子合并问题”的变形,有谈不上什么变形,倒不如说复制更好一点。

我想很多的牛人在这个题目失分的原因多为没弄懂题目的意思就下手做了,把题目看简单了。

简单的说:给你一项链,项链上有n颗珠子。

相邻的两颗珠子可以合并(两个合并成一个)。

合并的同时会放出一定的能量。

不同的珠子的合并所释放的能量是不同的。

问:按照怎样的次序合并才能使释放的能量最多?我们用top表示第i颗珠子的头标记,用wei表示第i颗珠子的尾标记,合并两颗相邻珠子所释放的能量是:Q=top*wei*wei[i+1]或top*top[i+1]*wei[i+1]; (一个样的)合并不一定按顺序的,本题所提供的样例也是导致出错的一大原因。

n个珠子进行一次合并的后,就归结到了n-1个珠子的合并的问题。

所以我们想到了动态规划。

既然是dp题目,必然要满足dp的两大条件:、1.最优子结构性质;设Q[i,j]表示第i颗珠子到第j颗珠子合并所产生的能量。

显然Q[1,n]表示的是合并产生的总的能量。

给定一种标号方法,maxQ[1,n]就是所要求的。

设最后一次合并在k处进行,则有Q[1,n]=Q[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]。

要Q[1,n]最大,必然要Q[1,k],Q[k+1,n]最大。

证明:假设Q[1,k]不是最大,则必然存在一Q'[1,k]>Q[1,k]。

那么就有Q'[1,n]=Q'[1,k]+Q[k+1,n]+top[1]*wei[k]*wei[n]>Q[1,k]。

这与Q[1,n]的最优性矛盾。

最优子结构性质得证。

2.无后效性;无后效性是显然的,进行某次合并,合并前与合并后状态是相对独立,不相关联,互不影响的。

算法已经定了下来了,关键是怎么实现了。

项链是一个环,而我们处理是对一个串进行的。

所以我们要把项链从某处割断展开,不同处的割断对应着不同的展开方法,也就是对应着不同的标号方法。

动态规划作业完整

动态规划作业完整

动态规划作业完整 The document was finally revised on 2021动态规划作业1、1、设某工厂自国外进口一部精密机器,由机器制造厂至出口港有三个港口可供选择,而进口港又有三个可供选择,进口后可经由两个城市到达目的地,其间的运输成本如图中所标的数字,试求运费最低的路线?2、把A看作终点,该问题可分为4个阶段。

f k(S k)表示从第K阶段点S k到终点A的最短距离。

f4(B1)=20,f4(B2)=40,f4(B3)=30f3(C1)=min[d3(C1, B1)+ f4(B1), d3(C1, B2)+ f4(B2), d3(C1, B3)+f4(B3) ]=70,U3(C1)= B2 或B3f3(C2)=40 ,U3(C2)= B3f3(C3)=80 ,U3(C3)= B1或B2 或B3f2(D1)=80 ,U2(D1)= C1f2(D2)=70 ,U2(D2)= C2f1(E)=110 ,U1(E)= D1或D2所以可以得到以下最短路线,E→D1→C1→B2 / B3→AE→D2→C2→B3→A3、习题4-2解:1)将问题按地区分为三个阶段,三个地区的编号分别为1、2、3;2)设Sk表示为分配给第k个地区到第n个地区的销售点数,Xk表示为分配给第k个地区的销售点数,S k+1=S k-X kPk(Xk)表示为Xk个销售点分到第k个地区所得的利润值fk(Sk)表示为Sk个销售点分配给第k个地区到第n个地区的最大利润值3)递推关系式:fk(Sk)=max[ Pk(Xk)+ f k+1(S k-X k) ] k=3,2,1f4(S4)=04)从最后一个阶段开始向前逆推计算第三阶段:设将S3个销售点(S3=0,1,2,3,4)全部分配给第三个地区时,最大利润值为:f3(S3)=max[P3(X3)] 其中X3=S3=0,1,2,3,4表1第二阶段:设将S2个销售点(S2=0,1,2,3,4)分配给乙丙两个地区时,对每一个S2值,都有一种最优分配方案,使得最大盈利值为:f2(S2)=max[ P2(X2)+ f3(S2-X2) ]其中,X2=0,1,2,3,4表2第一阶段:设将S1个销售点(S1=4)分配给三个地区时,则最大利润值为:f1(S1)=max[ P1(X1)+ f2(4-X1) ]其中,X1=0,1,2,3,4表3然后按计算表格的顺序反推,可知最优分配方案有两个:最大总利润为531)由X1*=2,X2*=1,X3*=1。

动态规划算法题(5题)

动态规划算法题(5题)

动态规划算法题(5题)1、题⽬描述(⽹易)有 n 个学⽣站成⼀排,每个学⽣有⼀个能⼒值,⽜⽜想从这 n 个学⽣中按照顺序选取 k 名学⽣,要求相邻两个学⽣的位置编号的差不超过d,使得这 k 个学⽣的能⼒值的乘积最⼤,你能返回最⼤的乘积吗?输⼊描述:每个输⼊包含 1 个测试⽤例。

每个测试数据的第⼀⾏包含⼀个整数 n (1 <= n <= 50),表⽰学⽣的个数,接下来的⼀⾏,包含 n 个整数,按顺序表⽰每个学⽣的能⼒值 ai(-50 <= ai <= 50)。

接下来的⼀⾏包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:输出⼀⾏表⽰最⼤的乘积。

试题分析:本题要使⽤动态规划来解,动态规划的特点:1.求解的是最优化问题;2.可以分解为最优⼦结构本题可以先求解在第i个学⽣的位置下,j(j<K)个学⽣的能⼒值的最⼤值,得到所有学⽣位置下j个学⽣的能⼒值的最⼤值;在j个学⽣的情况下,得到j+1个学⽣的最⼤值,样例输出: 10 8 7 2 -7 9 5 4 10 -7 1 3 3输出: 630如上,第⼀步先计算k=2的情况:7:在d=3的情况下,最⼤最⼩值都为562:在d=3的情况下,最⼤值为16,最⼩值为14-7:在d=3的情况下,最⼤值为-14,最⼩值为-56......得到第⼀趟的结果k=3的情况下(这⾥以第⼀趟的结果为基础,只有这样就不需要考虑第⼀趟中d=3的限制):2:在d=3的情况下,最⼤最⼩值都为112(56*2)-7:在d=3的情况下,最⼤值为-98(14*-7)最⼩值为-392(56*-7)9:在d=3的情况下,最⼤值为504(56*9)最⼩值为-504(-56*9)......得到第⼆趟的结果返回最⼤值就是最后的结果#-*- coding:utf-8 -*-n=input()array=[int(i) for i in raw_input().split()]k,d=[int(i) for i in raw_input().split()]# n=36array_max=array_min=array#轮询k-1趟即可for i in range(0,k-1):_max=[-float('inf')]*n#将最⼤值的数组赋值⽆穷⼩_min=[float('inf')]*n#将最⼩值的数组赋值⽆穷⼤for j in range(i+1,n):if j<=d+i:#下⾯对应的min、max都是考虑到array[j]为负值的情况下temp_max = max(max(ii*array[j] for ii in array_max[i:j]),max(ii*array[j] for ii in array_min[i:j]))temp_min = min(min(ii*array[j] for ii in array_max[i:j]),min(ii*array[j] for ii in array_min[i:j]))else:temp_max = max(max(ii*array[j] for ii in array_max[j-d:j]),max(ii*array[j] for ii in array_min[j-d:j]))temp_min = min(min(ii*array[j] for ii in array_max[j-d:j]),min(ii*array[j] for ii in array_min[j-d:j]))_max[j]=temp_max_min[j]=temp_minarray_max=_maxarray_min=_minprint array_maxprint array_minprint max(array_max)2、题⽬描述(腾讯):腾讯⼤厦有39层,你⼿⾥有两颗⼀抹⼀眼的玻璃珠。

动态规划模拟题及答案

动态规划模拟题及答案

动态规划测试题一:填空题(每空2分,共20分)1.动态规划算法的步骤是(找出最优解的性质,并刻画其结构特征)、(递归地定义最优值)(以自底向上的方式计算最优值)、(根据计算最优值时得到的信息构造最优解)。

2.为方便起见、将矩阵连乘积A i A i+1……A j简记为(A[i:j] )。

3.动态规划算法的两个基本要素是(最优子结构性质)和(重叠子问题性质)。

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

5.对于矩阵连乘问题、设计算A[i:j]、1≤i≤j≤n,所需要的最少数乘次数为m[i][j],则原则问题的最优值为(m[1][n] )。

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

二:综合题(第一题5分其余各题15分,共50分)1.补充下面的最大子段和动态规划算法。

int MaxSum(int n,int *a){int sum=0,b=0;for(int i=1;i<=n;i++){if(b>0){b+=a[i];besti=1;}else b=a[i];if(b>sum){sum=b;bestj=i;}}return sum;}2. 0—1背包问题:有5种物品,背包的容量为c=10,物品i的重量为wi,其价值为vi:(w1,v1)=(2,6) (w2,v2)=(2,3) (w3,v3)=(6,5) (w4、v4)=(5,4)(w5,v5)=(4,6), 求最优解及最优值。

解∵p[5+1]={(0,0)}又∵(w5,w5)=(4,6)∴q[5+1]=p[5+1]○+(4,6)={(4,6)}则p[5]=m5j-其中的受控点={(0,0),(4,6)}又∵(w4,v4)=(5,4)∴q[5]○+(w4,v4)={(0,0),(4,6)}○+(5,4)={(5,4),(9,10)}∴w4j=p[5]∨q[5]={(0,0),(4,6),(5,4),(9,10)}又∵(w3,v3)=(6,5)∴q[4]=p[4]○+(w3,v3)={(6,5),(10,11)}∴m3j=p[4]∨q[4]={(0,0),(4,6),(6,5),(9,10),(10,11)} 则p[3]=m3j-其中的受控点={(0,0),(4,6),(9,10),(10,11)}又∵(w2,v2)=(2,3)∴q[3]=p[3]○+(w2,v2)={(2,3),(6,9)}∴m2j={(0,0),(2,3),(4,6), (6,9),(9,10),(10,11) } p[2]=m2j-其中的受控点={(0,0),(2,3),(4,6),(6,9),(9,10),(10,11)}又∵(w1,v1)=(2,6)∴q[2]=p[2]○+(w2,v2)={(2,6),(4,9),(6,12),(8,15)}∴m1j={(0,0),92,3},(2,6),(4,6),(4,9),(6,9),(6,12),(8,15),(9,10),(10,11)}∴p[1]={(0,0),(2,6),(4,9),(6,12),(8,15)}∴此0—1问题的最优值15.最优解为p[1]={(0,0),(2,6),(4,9)(6,12),(8,15)}3.设n=4,(a1,a2,a3,a4)=(3,4,8.10),(b1,b2,b3,b4)=(6,2,9,15),求作业中的一种最优调度方案并计算其最优值。

动态规划训练题目

动态规划训练题目

动态规划题目【引例1、上楼梯】一个含有n阶的楼梯,一次可以走1阶或2阶,从底走到顶一共有几种走法?n<=90。

【引例2、数字三角形】a1有一个数字三角形,编程求从最顶层到最底层的一条路所经过位置上数字之和的最大值。

每一步只能向左下或右下方向走。

下图数据的路应为7->3->8->7->5,和为30。

输入:文件输入(从键盘读入文件名),文件格式:第一行:R(1<=R<=10000),数字三角形共有R行;以下R行:依次表示数字三角形中每行中的数字。

每个数都是非负的,且<=100.输出:一个正整数,路径上数字之和的最大值。

输入样例:573 88 1 02 7 4 44 5 2 6 5输出样例:30【引例3、求最大连续子序列的和。

】a2输入:第一行:n(N<500)第二行:n个整数(-3000,3000)。

输出:最大连续子序列的和。

样例:输入:7-6 4 -1 3 2 -3 2输出:81、最长递增序列b1设有整数序列b1,b2,b3,…,bm,若存在i1<i2<i3<…<in,且bi1<bi2<bi3<…<bin,则称b1,b2,b3,…,bm 中有长度为n的递增序列bi1,bi2,bi3,…,bin。

求序列b1,b2,b3,…,bm中最大递增序列长度(n)。

输入:m(<1000),整数序列输出:最大长度n样例:输入:7-6 4 -1 3 8 -3 2输出:42、背包问题b2设有n种物品,每种物品有一个重量及一个价值。

同时有一个背包,最大载重量为W,今从n种物品中选取若干件,使其重量的和小于等于W,而价值的和为最大。

输入数据:第一行两个数:物品总数N(<100),背包载重量W(<100);两个数用空格分隔;第二行N个数,为N种物品重量Wi;两个数用空格分隔;第三行N个数,为N种物品价值Vi; 两个数用空格分隔;输出数据:第一行总价值;输入样例:4 103 4 5 77 15 20 25输出样例:353、迷宫寻宝b3一个n行m列的迷宫(1<=n,m<=50),入口在左上角,规定只能向下或向右走。

  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];
}。

相关文档
最新文档