Chapter 4 动态规划 习题
动态规划练习题(含答案)
动态规划练习题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题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。
动态规划讲解大全含例题及答案
动态规划讲解大全含例题及答案动态规划讲解大全动态规划(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 ],前插一个字符
动态规划习题答案
动态规划习题答案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个阶段。
动态规划习题完整版
动态规划习题Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】动态规划专题分类视图数轴动规题:题1.2001年普及组第4题--装箱问题【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。
要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入格式】输入文件box.in有若干行。
第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品的各自体积。
【输出格式】输出文件box.out只有一行数据,该行只有一个数,表示最小的箱子剩余空间。
【输入样例】2468312797【输出样例】题2.1996年提高组第4题--砝码秤重__数据加强版【问题描述】设有n种砝码,第k种砝码有Ck 个,每个重量均为Wk,求:用这些砝码能秤出的不同重量的个数,但不包括一个砝码也不用的情况。
【输入格式】输入文件weight.in的第一行只有一个数n,表示不同的砝码的种类数.第2行至第n+1行,每行有两个整数.第k+1行的两个数分别表示第k种砝码的个数和重量.【输出格式】输出文件weight.out中只有一行数据:Total=N。
表示用这些砝码能秤出的不同重量数。
【输入样例】22223【输出样例】Total=8【样例说明】重量2,3,4,5,6,7,8,10都能秤得【数据限制】对于100%的数据,砝码的种类n满足:1≤n≤100;对于30%的数据,砝码的总数量C满足:1≤C≤20;对于100%的数据,砝码的总数量C满足:1≤C≤100;对于所有的数据,砝码的总重量W满足:1≤W≤400000;题3.石子归并-szgb.pas【问题描述】有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。
【输入】输入文件szgb.in的第一行只有一个整数n(1≤n≤50),表示有n堆石子。
动态规划习题集全
动态规划专题训练护卫队【问题描述】护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥。
因为街道是一条单行道,所以任何车辆都不能超车。
桥能承受一个给定的最大承载量。
为了控制桥上的交通,桥两边各站一个指挥员。
护卫车队被分成几个组,每组中的车辆都能同时通过该桥。
当一组车队到达了桥的另一端,该端的指挥员就用电话通知另一端的指挥员,这样下一组车队才能开始通过该桥。
每辆车的重量是已知的。
任何一组车队的重量之和不能超过桥的最大承重量。
被分在同一组的每一辆车都以其最快的速度通过该桥。
一组车队通过该桥的时间是用该车队中速度最慢的车通过该桥所需的时间来表示的。
问题要求计算出全部护卫车队通过该桥所需的最短时间值。
【输入格式】输入文件中的第一行包含三个正整数(用空格隔开),第一个整数表示该桥所能承受的最大载重量(用吨表示),第二个整数表示该桥的长度(用千米表示),第三个整数表示该护卫队中车辆的总数(n<1000)。
接下来的几行中,每行包含两个正整数W和S(用空格隔开),W表示该车的重量(用吨表示),S表示该车过桥能达到的最快速度(用千米/小时表示)。
车子的重量和速度是按车子排队等候时的顺序给出的。
【输出格式】输出文件中应该是一个实数,四舍五入精确到小数点后1位,表示整个护卫车队通过该桥所需的最短时间(用分钟表示)。
【输入输出样例】输入:100 5 1040 2550 2050 2070 1012 509 7049 3038 2527 5019 70输入:75.0DOLLARS【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。
编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。
【输入格式】输入文件中的第一行是一个自然数N(1<=N<=100),表示戴维学习汇率的天数。
接下来的N行中每行是一个自然数A(1<=A<=1000)。
第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。
动态规划复习题
动态规划复习题在计算机科学和数学领域中,动态规划是一种非常重要的算法思想和解题策略。
它常常被用于解决那些具有重叠子问题和最优子结构性质的问题,能够有效地降低计算复杂度,提高算法的效率。
动态规划的核心思想是将一个复杂的问题分解成若干个子问题,并通过保存子问题的解来避免重复计算,从而逐步求解出原问题的最优解。
这种方法的关键在于找出问题的最优子结构和状态转移方程。
让我们通过一个经典的例子来理解动态规划的基本概念。
假设有一个楼梯,我们需要从楼梯的底部走到顶部。
每次可以向上走 1 级或者 2 级台阶。
那么,请问走到第 n 级台阶共有多少种不同的走法?我们可以用动态规划的方法来解决这个问题。
首先,定义一个数组dp,其中 dpi 表示走到第 i 级台阶的不同走法数量。
对于第 1 级台阶,只有 1 种走法,即直接走上去,所以 dp1 = 1。
对于第 2 级台阶,可以一次走 2 级,也可以分两次每次走 1 级,所以 dp2 = 2。
对于第 i 级台阶(i > 2),它可以从第 i 1 级台阶走 1 级到达,也可以从第 i 2 级台阶走 2 级到达。
所以,走到第 i 级台阶的走法数量等于走到第 i 1 级台阶的走法数量加上走到第 i 2 级台阶的走法数量,即dpi = dpi 1 + dpi 2。
通过这种方式,我们可以从第 1 级和第 2 级台阶的基础情况出发,逐步计算出 dpn,即走到第 n 级台阶的不同走法数量。
另一个常见的动态规划问题是背包问题。
假设有一个背包,它的容量为 C,有 n 个物品,每个物品有自己的重量 wi和价值 vi。
我们需要选择一些物品放入背包,使得背包中物品的总价值最大。
同样地,我们可以定义一个二维数组 dp,其中 dpij 表示在前 i 个物品中,背包容量为 j 时能够获得的最大价值。
对于第 1 个物品,如果背包容量足够容纳它,那么 dp1j = v1(j >= w1),否则 dp1j = 0。
动态规划作业完整
动态规划作业1、1、设某工厂自国外进口一部精密机器,由机器制造厂至出口港有三个港口可供选择,而进口港又有三个可供选择,进口后可经由两个城市到达目的地,其间的运输成本如图中所标的数字,试求运费最低的路线?把A看作终点,该问题可分为4个阶段f k(S k)表示从第K阶段点S k到终点A的最短距离f4(B i)=20, f4(B2)=40, f4(B3)=30f3(C i)=min[d 3(C i, B i)+ f4(B i), d3(C i, B2)+ f4(B2), d3(C i, B3)+ f4(B3)]=70,U3(C l)= B2 或B3f3(C2)=40,U3(C2)= B3f3(C3)=80,U3(C3)= B l 或B2 或B3以D i)=80,U2(D I)=C If2(D2)=70,U2(D2)= C2f i(E)=110,U i(E)= D i 或D2所以可以得到以下最短路线,E T D I^C I^B 2 / B3^AE TD 2^C 2TB 3—A2、习题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+i(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,42第一阶段:设将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。
动态规划习题课
练习1:某厂生产三种产品,多种产品重量与利 润旳关系如表所示。现将此三种产品运往市场出售, 运送能力总重量不超出 6 吨,问怎样安排运送,使 总利润最大?
种类
123
重量(吨/公斤)
234
单件利润(元) 80 130 180
最优方案:X1 =(0.2.0)X2 =(1.0.1) Z=260
例4 投资问题
w2(5,3)+f3(2) w2(5,2)+f3(3) =max
12+8 10+11
=21
w2(5,1)+f3(4)
5+15
当k=1时,有s1=5 D1(s1)={0,1,2,3,4}
w1(5,4)+f2(1)
12+4
w1(5,3)+f2(2)
10+9
f1(5)=max w1(5,2)+f2(3) =max 6+14 =21
可提高成绩 aij , (i, j 1,2,3,4) 。用动态规划方法求使其 成绩提高最多的复习天数安排计划。要求写出问题的 阶段变量,状态变量,决策变量,阶段指标函数,基 本方程(递推公式)。
max
0x3x整3 数 a53
12 x3 f2 (5 5 x3 )
=max
0
x3
5 5
12 x3 f2 (5 5 x3 )
x3整数
=max x3=0,1
12 x3
f2(5 5x3 )
=max0 f2 (5),
12 f2 (0)
( x3 0)
( x3 1)
f2(5)
w1(5,1)+f2(4)
3+18
w1(5,0)+f2(5)
动态规划习题概要
第七章动态规划规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。
在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。
所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。
将各个阶段的决策综合起来构成一个决策序列,称为一个策略。
显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。
当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。
多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。
动态规划(dynamic programming)同前面介绍过的各种优化方法不同,它不是一种算法,而是考察问题的一种途径。
动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。
当然,由于动态规划不是一种特定的算法,因而它不象线性规划那样有一个标准的数学表达式和明确定义的一组规则,动态规划必须对具体问题进行具体的分析处理。
在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。
动态规划的主要创始人是美国数学家贝尔曼(Bellman)。
20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。
1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。
该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。
1961年贝尔曼出版了他的第二部著作,并于1962年同杜瑞佛思(Dreyfus)合作出版了第三部著作。
在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。
复习用-动态规划-4-bellman-ford负短路径
的路径都包含n
数时,某些点
条边,大量是
不可达,则最
少于n条边
短路径长度不
会变化
7
bellman-ford实现
实际的实现. 维护一个队列M[v] = 到目前为止所找到的v-t最短 路径长度 不需要检测边(v, w),除非在先前的循环中改变了 M[w]. 没有更新,说明最短路径已经检查完毕,或部分 点不可达
5
动态规划算法 定义. OPT(i, v) = 经过最多i条边的v-t的最短路径 P 的长度
Case 1: P 经过至多 i-1 条边. – OPT(i, v) = OPT(i-1, v)
Case 2: P 刚好经过 i 条边. – 假设 (v, w) 是一条边, OPT 经过边 (v, w), 然后经 过最多经过 i-1 条边的w-t的路径
OPT (i, v)
0
min OPT (i 1,
v) ,
min OPT (i 1,
(v, w) E
w) cvw
if i 0 otherwise
Remark.如果没有负圈,,假设图共n个顶点,则 OPT(n-1, v) = v-t最短路径长度.
算法实现
Shortest-Path(G, t) { foreach node v V M[0, v] M[0, t] 0
for i = 1 to n-1 foreach node v V M[i, v] M[i-1, v] foreach edge (v, w) E M[i, v] min { M[i, v], M[i-1,
w] + cvw } }
分析:不是运所有行点到时t间(mn) ,空间:边数不(大n2于)某.
Theorem. 通过这个算法, M[v] 是v-t 路径的长度, 经过 i 次循环更新, M[v] 的值不大于 v-t 的 i条边 的最短路径长度.
动态规划例题选讲
谢谢大家!
例题5 0/1背包问题
• 有N个物品,每个物品i的重量是W[i],问你 一个可以载重M的背包,最多可以装多少个 物品? • 例如N = 5 • W = {1, 2, 3, 4, 5} • M=3 • 可以装{1, 2}也可以装{3},但是装最多的物 品是装{1, 2},总共2个物品。
例题5 0/1背包问题
例题4 最长上升子序列问题
• 用F[i]表示以a[i]结尾的最长上升子序列的长 度,那么有 F[i] = max { F[j] + 1, 1 <= j < i && a[j] < a[i]} 对于状态i来说,它可以接到所有的在它之 前的并且比它小的数的后面构成上升子序 列,所以我们要枚举状态j进行转移。时间 复杂度为O(N^2)。
例题9 中国邮路问题
• 显然,最后答案为F[0]。 • 复杂度分析: • 状态数为O(2^N),转移为O(N^2),总的时间 复杂度为O(N^2 * 2^N)。 • 作业:完成poj2404
例题10 两条路径问题
• 回忆问题1,我们要从左上角走到右下角, 走2条不想交的路径(起点终点除外),问 有多少种方法。
例题3 序列问题
• 复杂度分析: • 状态总数为O(N),O(1)的转移,总的时间复 杂度为O(N)。 • 作业:完成poj1050
例题4 最长上升子序列问题
• 给一个长度为N的序列A[],求出其中的最长 上升子序列的长度。 • 例如N = 5 • A[] = {2, 1, 4, 3, 5} • 答案为3,序列是{2, 4, 5}, {2, 3, 5}, {1, 4, 5}, {1, 3, 5}
例题7 汉密顿路问题
• 令F[mask][i]表示当前已经走过的点集为 mask,最后一个到达的点为i的最段路径, 这里mask是一个N位二进制数,如10101表 示点1,3,5是已经走过的,2,4是没有走 过的,那么方程转移如下: F[mask][i] = max{ F[mask’][j] + a[i][j] } 当a[i][j]不为-1,且mask’等于mask中把i的1 置为0,如mask=10101,则所有的mask’为 00101, 10001, 10100。
动态规划算法题(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层,你⼿⾥有两颗⼀抹⼀眼的玻璃珠。
动态规划练习题
最小乘车费用 (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)【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。
求大神解答一下这题的解题过程尤其是第3步到第4步的过程
求大神解答一下这题的解题过程尤其是第3步到第4步
的过程
这道题目是一道动态规划题目,我们可以使用动态规划的方法来解决它。
首先,在解决动态规划问题之前,我们必须首先定义一个子问题。
在
这里,我们的子问题是对于cur容量为i时,能够与最大的值。
那么,我
们可以定义一个状态数组dp[i],表示容量为i时,能够获取的最大价值。
第二步,我们要确定问题的状态转移方程,即当前状态与其之前的状
态有什么关系。
由于我们在容量为cur时,只能选择剩余的货物中的一个,因此可以将状态转移方程定义为:
dp[i] = max (dp[i], dp[i - weights[j]] + values[j]),其中i表
示剩余容量,weights[j]表示第j件货物的重量,values[j]表示第j件
货物的价值。
这里,max代表我们要取最大值,因为我们想要获得最大的价值,所
以取最大值。
dp[i - weights[j]] + values[j]表示的是在不选择第j件
货物的情况下,容量为i时,能够获取的最大值加上选择第j件货物时,
获取的价值。
第三步,我们要确定边界条件。
由于在容量为cur时,我们只能选择
货物中的一件,所以我们可以分成两种情况:一种是不选择任何货物,即
当容量为0时,最大价值为0,另一种是选择货物,当容量不为0时,最
大价值初始化为负无穷。
因此,我们可以设置如下的边界条件:
dp[0] = 0 // 容量为0时,最大价值为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M3
C[1,4]=180
C[1,5]=?
(M1 M2) (M3 M4)
C[2,4]=132
C[2,5]=207
M2 (M3M4)
M2 ((M3M4) M5)
C[3,4]=72
C[3,5]=132
(M3M4)
(M3M4) M5
C[4,4] =0
C[4,5]=120
M4
输出:背包所能装物品的最大价值
1. for i←0 to n
2. V[i,0] ←0
3. end for
4. for j←0 to C
5. V[0,j] ←0
6. end for 7. for i←1 to n //前i个物品 8. for j←1 to C //承重量C与物品重量wi均为整数,故j为整数 9. V[i,j] ← V[i-1,j]
M2
53
M3
36
M4
64
M5
45
d 0
d 1
d 2
r1 4, r2 5, r3 3, r4 6, r5 4, r6 5
d 3
d 4
C[1,1]=0 M1
C[1,2]=60 (M1 M2)
C[2,2]=0 M2
C[1,3]=132 (M1 M2) M3 C[2,3]=90
(M4 M5)
C[5,5] =0
M5
C[i,
j]
min{C[i, k
ik j
1] C[k,
j]
ri
rk
rj1}
C[1,
5]
min{C[1,
1k 5
k
1]
C[k
,
5]
r1
rk
r51}
k 2 C[1,5]=C[1,1] C[2,5] r1 r2 r51 0 207 4 5 5 307 M1 (M 2 ((M3 M 4 ) M5 ))
Case 1:
Case 2:
V[i-1,j]
…
j
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
V[i-1,j-wi] …
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
j-wi wi
南京理工大学
可重复情形:
方法1:设V[i,j]表示从前i个物品{u1,u2,…,ui}中取出一部分装入承重量为j的背包
min
k 5 C[1,5]=C[1, 4] C[4,5] r1 r5 r51 180 0 4 4 5 260 ((M1 M 2 ) (M3 M 4 )) M5
南京理工大学
可重复背包问题(7.27)
• 给定n个物品{u1,u2,…,un}和一个背包,物品i 的重量为 wi,价值为vi,已知背包的承重量为C,并且每个物品 的个数没有限制。问:在不撑破背包的条件下,选择 哪些物品装入背包,得到的总价值最大?
u1 u2
ui-1 ui
…
?
j
w1 w2
wi-1 wi
v1 v2
vi-1 vi
0 V[i, j] V[i 1, j]
max{V[i 1, j],V[i 1, j wi ] vi}
if i 0 or j 0 if j wi if i 0 and j wi
可重复背包问题的形式化描述: 给定C>0 , wi>0, vi>0, 1≤i≤n, 找出一个n 元的向量 (x1,x2,…,xn),xi为非负整数, 1≤i≤n, 求如下优化问题:
n
max vi xi i 1 n
s.t. wi xi C i 1
南京理工大学
0-1情形:设V[i,j]表示从前i个物品{u1,u2,…,ui}中取出一部分装入承重量为j的背包所能 取得的最大价值。那么,当i=n,j=C时, V[n,C] 就是原问题的解。
所能取得的最大价值。那么,当i=n,j=C时, V[n,C] 就是原问题的解。
u1 u2
ui-1 ui
…
?
j
w1 w2
wi-1 wi
v1 v2
vi-1 vi
V[i, j] V0 [i 1, j]
if i 0 or j 0 if j wi
max{V [i
1,
j], max {V[i 1k j / wi
2. for i ← 0 to n
3. C[i,0] ← 1
4. C[i,i] ← 1
5. end for
6. for i ←2 to n
7. for j ←1 to i-1
8.
C[i,j] ← C[i-1,j-1] + C[i-1,j]
9. end for
10. end for
11. Return C[n,k]
南京理工大学
习题7.3: 给出一个求解二项式系数Cnk的高效算法。你设计的算法的时间复 杂度是什么?
Cnk
1 Cnk11 +Cnk1
, k==0||k==n , 0<k<n
0
1
0
1
1
1
1
2
1
2
1
3
3
1
4
n
2
3
n
1
3
1
6
4
1
南京理工大学
输入:整数n,k 输出:二项式系数Cnk
1. If k==0 || n==k return 1;
k 3 C[1,5]=C[1, 2] C[3,5] r1 r3 r51 60 132 4 35 252 (M1 M 2 ) ((M3 M 4 ) M5 ) k 4 C[1,5]=C[1,3] C[4,5] r1 r4 r51 132 120 4 6 5 372 ((M1 M 2 ) M3) (M 4 M5 )
1,
j
k
*
wi
]
k
* vi }},
if i 0 and j wi
Case 1:
Case 2:
V[i-1,j]
…
j
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
V[i-1,j-k*wi]
…
j-k*wi
u1 u2
ui-1
w1 w2
wi-1
v1 v2
vi-1
k*wi
南京理工大学
输入:物品集合{u1,u2,…,un},重量分别为w1, w2,…,wn,价值分 别为v1,v2,…,vn, 承重量为C的背包//物品可重复装入
Θ(1) Θ(n)
n i 1
a a 2a .... (n 1)a
i 2 j 1
(n2)
If i=n and j=k then break 不会影响时间复杂度 T(n)=Θ(n2)
南京理工大学 习题7.9: (题略)
M1
45