算法设计与分析-动态规划习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a
j
k
T(n)=2T(n/2)+O(n) 解此递归方程可知,T(n)=O(nlogn) 3) 记 b[j]=
a
k 1
j
k
,1≤i≤n,则所求的最大子段和问题为
a
k 1
j
k
=max max
a
k i
j
k
=max b[j]
由 b[j]的定义可知,b[j-1]>0 时,b[j]= b[j-1]+a[j], 否则 b[j]=a[j],因此 b[j]的动态规划递 归式 b[j]=max{b[j-1]+a[j],a[j]},1≤j≤n。 据此, 可设计出最大子段和动态规划算法如下: int MaxSum(int n,int *a) { Int sum=0,b=0; For(int i=1;i<=n;i++){ If(b>0)b+=a[j]; Else b=a[j]; If(b>sum)sum=b; } Return sum; } 显然,这个算法需要的时间和空间复杂度均为 O(n)。
则 RELI(1,n,c)可靠性设计的最优值为:
初始条件:f0 (X)=1,0≤X≤c
i
S ={ (f , X ) | f =f (X ) }
i i
S ={ (f , X ) | f =f (X ) }为可靠性设计问题 RELI(1,i,X) 的最优解,(f, X)是由 m1 ,m2 ,…,mi 的
按此递归式计算出来的 m(n,b)为最优值,算法所需的计算时间为 O(nb)。
4、可靠性设计:一个系统由 n 级设备串联而成,为了增强 可靠性,每级都可能并联了不止一台同样的设备。假设第 i 级设备 Di 用了 mi 台,该级设备的可靠性是 gi(mi),则这个 系统的可靠性是Π gi(mi)。一般来说 gi(mi)都是递增函数,所 以每级用的设备越多系统的可靠性越高。但是设备都是有成 本的, 假定设备 Di 的成本是 ci, 设计该系统允许的投资不超 过 c,那么,该如何设计该系统(即各级采用多少设备)使 得这个系统的可靠性最高。试设计一个动态规划算法求解可 靠性设计。
2
a
k 1
j
k
,j=1,2, …,n)
a[1,n]的最大子段为 k 1 ,且 1≤i≤n/2,n/2+1≤j≤n; 前两种情况可以通过递归求的,对于第三种情况,容易看出,a[n/2]与 a[n/2+1] 在最优子 序列中, 因此可以求出 a[1,n/2]中的最大子段 s1 和与 a[n/2+1,n]的最大子段和 s2,s1+s2 即 为第三种情况的最大子段和。 该算法所需的计算时间 T(n)满足典型的分治算法递归式
i
不同决策序列决定的,即:
S ij
具体算法如下:
0
1. S ห้องสมุดไป่ตู้{(1,0)}
i-1
2. 假设已求出 S
i
。
3. S 的求解步骤如下:
对于 m 的所有可能值,依次求出 m =j,1≤j≤u 时,有可能得到的所有序偶的集合
i i i i
。
将u个
i
按支配规则归并即得 S
3、考虑下面特殊的整数线性规划问题
试设计一个解此问题的动态规划算法,并分析算法的时间复 杂度。
解:该问题是一般情况下的背包问题,具有最优子结构性质。 设所给背包问题的子问题
的最优值为 m(i,j), 即 m(i,j)是背包容量为 j,可选物品为 1,2,…,i 时背包问题的最优解。 由背包问题的最优子结构性质,可建立计算 m(i,j)的递归式如下:
设 RELI(1,i,X) :表示在可容许成本 X 约束下,对第 1 种到第 i 种设备的可靠性设计问题。 目标函数:
约束条件:
, RELI(1,n,c): 表示整个系统的可靠性设计问题。 该问题具有最优子结构性质, 假设 m1 , m2, …, mn 为 RELI(1,n,c)的最优解,假设 m1 为第 1 级的最优选择,则 m2 ,…,mn 为 RELI(2,n,c-m1 c1) 的最优解,否则设 m’ 2,…,m’ n 为 RELI(1,n,c-m1 c1 )的最优解,则 m1,m’ 2,…m’ n 为 RELI(1,n,c) 的最优解。矛盾。 系统可靠性设计问题 RELI(1,n,c)的最优解是对 m1 ,m2,…,mn 的一系列决策的结果。设 fi(X) 是在允许成本值 X 约束下对前 i 种设备组成的子系统 RELI(1,i,X)可靠性设计的最优值,即:
2、 (双机调度问题)用两台处理机 A 和 B 处理个作业。设第 i 个作业交给机器 A 处理时所需要的时间是,若由机器 B 来 处理,则所需要的时间是 bi。现在要求设计每个作业只能由 一台机器处理,每台机器处理完这 n 个作业的时间最短(从 任何一个机器开工到最后一台机器停工的总的时间) ,以下 面的例子说明你的算法。
解: 设最优解为 C[n], 设在处理第 i 个作业时, 当前为最优值 C[i], 在 A 上处理的总时间为 A[i],B[i] 处理的总时间为 B[i], N=1, 显然有 a1<b1, 故 C[1]=A[I]=a[1]=2,B[1]=0,A 加工 N=2,A[2]=2+5=7<B[1]+8=0+8, 因此 C[2]=A[2]=7,B[2]=0,A 加工 N=3,A[2]+7=14>B[2]+b[3]=4, 因此 C[3]=C[2]=7,A[3]=7,B[3]=4,B 加工 N=4,A[3]+10=17>B[3]+11=15. 因此 C[4]=B[4]=15,A[4]=7,B[4]=15,B 加工 N=5,A[5]+5=12<B[5]+3=18, 因此 C[5]=C[4]=15,A[5]=9,B[5]=15,A 加工 N=6,A[6]+2=14<B[6]+4=19, 因此,C[6]=C[5]=15,A[6]=14,B[6]=15,A 加工 因此处理的总时间为 15,A 加工 1、2、5、6 个作业,B 加工 3、4 个作业
习题五 1、
j
最大字段和问题:给定正整数 a1,a2,… ,an,求该序列形
a
k 1 k
如
的子段和的最大值: max 0, max X k
j
k 1
1) 已知一个简单算法如下: int Maxsum(int n,int a,int& besti,int& bestj) { int sum = 0; for(int i=1;i<=n;i++){ int suma = 0; for(int j=i;j<=n;j++){ suma + = a[j]; if(suma > sum){ sum = suma; besti = i; bestj = j; } } } return sum; } 试分析该算法的时间复杂性。 2) 试用分治算法解最大子段和问题,并分析算法的时间复杂性。 3) 试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问 题。分析算法的时 间复杂度。 (提示:令 b( j ) max 解: 1) 该简单算法嵌套了两个 for 循环, 均是从 1 到 n 进行循环。 因此, 时间复杂性为 o (n ) 。 2) 如果将所给序列 a[1,n]分为长度相等的两段 a[1,n/2]和 a[n/2+1,n], 分别求出这两段的最大 子段和,则 a[1,n]的最大子段和有三种情形: a[1,n]的最大子段和与 a[1,n/2]的最大子段和相同; a[1,n]的最大子段和与 a[n/2+1,n]的最大子段和相同;