文档视界 最新最全的文档下载
当前位置:文档视界 › 5 动态规划算法习题答案

5 动态规划算法习题答案

5 动态规划算法习题答案
5 动态规划算法习题答案

1.最大子段和问题:给定整数序列 n a a a ,,,21 ,求该序列形如∑=j

i

k k a 的子段和

的最大值: ?

??

???∑=≤≤≤j

i k k n j i a 1max ,0max

1) 已知一个简单算法如下:

int Maxsum(int n,int a,int& best i,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) 试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问题。分析算法的时间复杂度。

(提示:令1()m ax

,1,2,,j

k

i j n

k i

b j a

j n

≤≤≤===∑ )

解:1)分析按照第一章,列出步数统计表,计算可得)(2

n O

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]的最大子段和相同; ③a[1:n]的最大子段和为两部分的字段和组成,即

j n j

i

l n i j

a a a a a

+++++=+??

?

???=??

????∑ 122;

intMaxSubSum ( int *a, int left , int right){

int sum =0;

if( left==right)

sum = a[left] > 0? a[ left]:0 ;

else

{int center = ( left + right) /2;

int leftsum =MaxSubSum ( a, left , center) ;

int rightsum =MaxSubSum ( a, center +1, right) ;

int s_1 =0;

int left_sum =0;

for ( int i = center ; i >= left; i--){

left_sum + = a [ i ];

if( left_sum > s1)

s1 = left_sum;

}

int s2 =0;

int right_sum =0;

for ( int i = center +1; i <= right ; i++){

right_sum + = a[ i];

if( right_sum > s2)

s2 = right_sum;

}

sum = s1 + s2;

if ( sum < leftsum)

sum = leftsum;

if ( sum < rightsum)

sum = rightsum;

}

return sum;

}

int MaxSum2 (int n){

int a;

returnMaxSubSum ( a, 1, n) ;

} 该算法所需的计算时间T(n)满足典型的分治算法递归分式T(n)=2T(n/2)+O(n),分治算法的时间复杂度为O(nlogn)

3)设}{m

a x )(1∑=≤≤=j

i

k k j

i a j b ,则最大子段和为).(max max

max max

max 11111j b a

a

n

j j

i

k k

j

i n j j

i

k k

n

j n i ≤≤=≤≤≤≤=≤≤≤≤==∑∑

},,,,max{)(11211j j j j j j j a a a a a a a a a j b +++++=---

最大子段和实际就是)}(,),2(),1(max{n b b b .

要说明最大子段和具有最优子结构性质,只要找到其前后步骤的迭代关系即可。

}

,)1(max{},}{max max{

},}{max{}{max )(1

1

11

11

1j j j j j i

k k j i j j i j j i

k k j

i

k k j

i a a j b a a a a a a a j b +-=+=+==∑∑∑-=-≤≤-≤≤-==≤≤ 若0)1(>-j b , j a j b j b +-=)1()(;

若0)1(≤-j b ,j a j b =)(。

因此,计算)(j b 的动态规划的公式为:.1},,)1(max{)(n j a a j b j b j j ≤≤+-=

intMaxSum (int* a ,int n ) {

int sum = 0, b = 0,j=0; for( int i=1;i<=n;i++) { if( b >0)

b = b + a [i];

else

b = a [i];

end{if} if( b > sum)

sum = b;

j=i ; end{if}

}

return sum; }

自行推导,答案:时间复杂度为O (n )。

2.动态规划算法的时间复杂度为O (n )(双机调度问题)用两台处理机A 和B 处理n 个作业。设第i 个作业交给机器A 处理时所需要的时间是i a ,若由机器B 来处理,则所需要的时间是i b 。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这n 个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。以下面的例子说明你的算法:

)4,3,11,4,8,3(),,,,,(),2,5,10,7,5,2(),,,,,(,6654321654321===b b b b b b a a a a a a n

解:(思路一)在完成前k 个作业时,设机器A 工作了x 时间,则机器B 此时最小的工作时间是x 的一个函数。

设F[k][x]表示完成前k 个作业时,机器B 最小的工作时间,则

)}](1[,)](1[m in{)]([k k a x k F b x k F x k F --+-=

其中k b x k F +-)](1[对应第k 个作业由机器B 来处理(完成k-1个作业时机器A 工作时间仍是x ,则B 在k-1阶段用时为)](1[x k F -);而)](1[k a x k F --对应第k 个作业由机器A 处理(完成k-1个作业,机器A 工作时间是x-a[k],而B 完成k 阶段与完成k-1阶段用时相同为)](1[k a x k F --)。

则完成前k 个作业所需的时间为)}]([,max{x k F x 1)当处理第一个作业时,a[1]=2,b[1]=3;

机器A 所花费时间的所有可能值范围:0 ≤x ≤a[0]. x<0时,设F[0][x]= ∞,则max(x, ∞)= ∞; 0≤x<2时,F[1][x]=3,则Max(0,3)=3, x ≥2时, F[1][x]= 0,则Max(2,0)=2;

2)处理第二个作业时:x 的取值范围是:0 <= x <= (a[0] + a[1]), 当x<0时,记F[2][x] = ∞;以此类推下去

(思路二)假定n 个作业的集合为{}n S n ,,2,1 =。

设J 为n S 的子集,若安排J 中的作业在机器A 上处理,其余作业在机器B 上处

理,此时所用时间为???

?

?

?

=∑∑∈∈J S j j J

j j

b a J T \,max )(,

则双机处理作业问题相当于确定n S 的子集J ,使得安排是最省时的。即转化为求J 使得)}({m in J T n

S J ?。若记{}1,,2,11-=-n S n ,则有如下递推关系:

??

?

? ?

????? ??

+????

?

?

+=????

??

∑∑∑∑

∑∑∈∈?∈∈?∈∈?J S j j n J

j j S J J S j j J

j j n S J I S j j I

j j S I b b a b a a b a n n n

\\\,max

min ,,max min min ,

max min 1

1

--(思路三)

此问题等价于求(x 1,……x n ),使得它是下面的问题最优解。

min max{x 1a 1+……x n a n ,(1-x 1)b 1+……+(1-x n )b n } x i =0或1,i=1~n

基于动态规划算法的思想,对每个任务i ,依次计算集合S (i)。其中每个集合中元素都是一个3元组(F 1,F 2,x )。这个3元组的每个分量定义为 F 1:处理机A 的完成时间 F 2:处理机B 的完成时间 x :任务分配变量。当x i =1时表示将任务i 分配给处理机A ,当x i =0时表示分配给处理机B 。 初始时,S (0)={(0,0,0)}

令F=按处理时间少的原则来分配任务的方案所需的完成时间。

例如,当(a 1,a 2,a 3,a 4,a 5,a 6)=(2,5,7,10,5,2),(b 1,b 2,b 3,b 4,b 5,b 6)=(3,8,4,11,3,4)时,按处理时间少的原则分配任务的方案为(x 1,x 2,x 3,x 4,x 5,x 6)=(1,1,0,1,0,1) 因此,F=max{2+5+10+2,7+5}=19。 然后,依次考虑任务i ,i=1~n 。在分配任务i 时,只有2种情形,x i =1或x i =0。此时,令S (i)={S (i-1)+(a i ,0,2i )}U{S (i-1)+(0,b i ,0)}在做上述集合并集的计算时,遵循下面的原则: ①当(a,b,c ),(d,e,f)?S (i)且a=d,b<=e 时,仅保留(a,b,c ); ②仅当max{a,b}<=F 时,(a,b,c)?S (i) 最后在S (n)中找出使max{F 1,F 2}达到最小的元素,相应的x 即为所求的最优解,其最优值为max{F 1,F 2}。

当(a 1,a 2,a 3,a 4,a 5,a 6)=(2,5,7,10,5,2),(b 1,b 2,b 3,b 4,b 5,b 6)=(3,8,4,11,3,4)时, 按处理时间少的原则分配任务的方案为(x 1,x 2,x 3,x 4,x 5,x 6)=(1,1,0,1,0,1) 因此,F=max{2+5+10+2,7+5}=19。 S(0)={(0,0,0)}; S(1)={(2,0,2),(0,3,0)}

S(2)={(7,0,6),(5,3,4),(2,8,2),(0,11,0)}

S(3)={(14,0,14),(12,3,12),(9,8,10), (7,4,6), (5,7,4),(2,12,2),(0,15,0)}

S(4)={(19,8,26), (17,4,22),(15,7,20),(12,12,18),(14,11,14),(9,19,10),(7,15,6),(5,18,4)}

S(5)={ (19,11,46), (12,15,38), (19,11,26), (17,7,22), (15,10,20),(12,15,18),(14,14,14),(7,18,6)} S(6)={ (14,15,102),(19,7,86),(17,10,84),(14,15,82), (9,18,70),(12,19,38), (15,14,20),(12,19,18)} max(F 1,F 2)最小的元组为(14,15,102), (14,15,82), (15,14,20) 所以,完成所有作业最短时间是15,安排有三种: (1,1,0,0,1,1),(1,0,0,1,0,1),(0,1,0,1,0,0)

3.考虑下面特殊的整数线性规划问题

n

i x b x a

x c

i n

i i i

n

i i

i

≤≤∈≤∑∑==1},2,1,0{,

max

1

1

试设计一个解此问题的动态规划算法,并分析算法的时间复杂度。 解:方法1.

设,21},1,0{n i y i ≤≤∈令n i y y x n i i i ≤≤+=+1,,则上述规划问题转化为:

n

i y b y a

y c

i n

i i i

n

i i

i

21},1,0{,

max

21

21

≤≤∈≤∑∑==,其中n i a a c c i n i i n i ≤≤==++1,,,

把i c 看作价值,i a 看作重量,b 看作背包容量。

转化为0/1背包问题,所以可以0/1背包问题的动态规划算法来求解。由于n 件物品的0/1背包的时间复杂性是O (2n ),则此时为O (4n )。

方法2.

可以看成是另一种背包问题。即b 为背包容量,}2,1,0{x i ∈为背包中可以装0,1,或者2件物品,i x 对应的价值为i c ,求在容量b 一定的前提下,背包所容纳的物品的最大价值。也就是参数完全相同的两个0-1背包问题,它们同时制约于背包容量为C 这个条件。

在设计算法时可以优先考虑i m ,也就是先判断背包剩下的容量能不能放进去i c

,若可以再判断能否使1=i p ,若可以则就再放入一个i c ,这样就间接满足了

2=+=i i i p m x 的条件。

(1,) (,)x m k x m k x -∞<-=递推式:

0m ax{(1,), (1,)} 2m ax{(1,), (1,),(1,2)2} 2(3)

k

k k k k k k k k k n

x w m k x m k x w p w x w m k x m k x w p m k x w p x w

O ??

---+≤

4. 可靠性设计:一个系统由n 级设备串联而成,为了增强可靠性,每级都可能并联了不止一台同样的设备。假设第i 级设备D i 用了m i 台,该级设备的可靠性是g i (m i ),则这个系统的可靠性是Πg i (m i )。一般来说g i (m i )都是递增函数,所以每级用的设备越多系统的可靠性越高。但是设备都是有成本的,假定设备D i 的成本是c i ,设计该系统允许的投资不超过c ,那么,该如何设计该系统(即各级采用多少设备)使得这个系统的可靠性最高。试设计一个动态规划算法求解可靠性设计问题。

解:问题描述:∏=n

i i i

m g

1

)

(max

约束条件:?????

????

?

??-+≤≤≤∑∑==n

n

i i i i n

i i c c c m c c m 1

1

11,

记)]([x k G 为第k 级设备在可用投资为x 时的系统可靠性最大值 则有如下关系式

)}](1[)({)]([max

1k k k k c x m m c x k G m g x k G k k --?=

?

?

?

???≤≤

定义下列函数

??

??

?∞-≤≤=∑=else

c

x c

x G n

i i

,,

1)](0[1

???????

????

??>-?≤≤-?<

∞-=??????≤≤=??????≤≤=∑∑c

x m c x G m g c

x c

m c x G m g c

x x G c c m n

i i

c x m n

i i

)},](0[)({)},

](0[)({,)](1[111111

111111

max max 1111

???

?

??

?≥

--?<

∞-=∑∑=??

?

???????

??≤≤=n

k

i i

k k k k c c c x

m n

k i i

c

x m c x k G m g c

x x k G k k )},

](1[)({,

)]([max

),m in(11

初始计算)](0[c G ,依次求解,即可得出策略集。

令∑=-='n

i i c c c 1

,1-='i i m m ,则

转化问题描述:∏='n

i i i

m g

1

)

(max

约束条件:?????

????

?

??-≤'≤'≤'∑∑==n n

i i i i n

i i c c c m c c m 1

1

0,

??

???∞--≤≤=∏∑==else

c c x g x G n

i n

i i i ,0),

1()](0[1

1

???

?

?≥-?<∞-=??

????'????

??≤≤11111),m in(11

)},

](0[)({,

)](1[max

1

1

1c x m c x G m g c x x G c c c x

m

??

?

?

?≥--?<∞-=??

????'????

??≤≤k k k k k c c c x

m k

c x m c x k G m g c x x k G k

k )},

](1[)({,

)]([max

),m in(11

思路二:部分同学尝试转化为类似背包问题,但是权重值需要进行一系列的转化,背包中相同的物品,不再具有相同的价值。

问题描述:)(ln

max

1

i i n

i m g ∑=

约束条件:?????

????

?

??-+≤≤≤∑∑==n n

i i i i n

i i c c c m c c m 1

1

11,

多段图

台时的权重

备的第级设备,而且是该级设

个阶段增加一台第表示第s i k i i

k

ω

当第i 个阶段第k 级设备增加第1+s i 台时,??

??

?∞+=其余情况

,若满足约束条件-,)()

1(ln s k s k i

k i g i g ω

阶段数上限为?????

????

?

??-∑=}min{1

k n

i i c c c ,阶段数下限为?????

????

?

??-∑=}max{1

k n

i i c c c

(仅供参考,自行整理答案。)

111)

1(ln )2(ln 1

k k k g g -=ω)

()1(ln

i g i g k k i

k +=ω

动态规划例题

例1:机器负荷分配问题 某公司新购进1000台机床,每台机床都可在高、低两种不同的负荷下进行生产,设在高负荷下生产的产量函数为g(x )=10x (单位:百件),其中x 为投入生产的机床数量,年完好率为a =0.7;在低负荷下生产的产量函数为h(y)=6y (单位:百件),其中y 为投人生产的机床数量,年完好率为b=0.9。计划连续使用5年,试问每年如何安排机床在高、低负荷下的生产计划,使在五年内生产的产品总产量达到最高。 例2:某企业通过市场调查,估计今后四个时期市场对某种产品的需要量如下表: 时期(k) 1 2 3 4 需要量(d k ) 2(单位) 3 2 4 假定不论在任何时期,生产每批产品的固定成本费为3(千元),若不生产,则为零;生产单位产品成本费为1(千元);每个时期生产能力所允许的最大生产批量为不超过6个单位,则任何时期生产x 个单位产品的成本费用为: 若 0<x ≤6 , 则生产总成本=3十1·x 若 x =0 , 则生产总成本=0 又设每个时期末未销售出去的产品,在一个时期内单位产品的库存费用为0.5(千元),同时还假定第1时期开始之初和在第4个时期之末,均无产品库存。现在我们的问题是;在满足上述给定的条件下,该厂如何安排各个时期的生产与库存,使所花的总成本费用最低? 例3:设某企业在第一年初购买一台新设备,该设备在五年内的年运行收益、年运行费用及更换新设备的净费用如下表:(单位:万元) 年份(k) 役龄(t) 运行收益()k g t 运行费用()k r t 更新费用()k c t 第一年 0 22 6 18 第二年 0 1 23 21 6 8 19 22

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

动态规划算法原理及其应用研究 系别:x x x 姓名:x x x 指导教员: x x x 2012年5月20日

摘要:动态规划是解决最优化问题的基本方法,本文介绍了动态规划的基本思想和基本步骤,并通过几个实例的分析,研究了利用动态规划设计算法的具体途径。关键词:动态规划多阶段决策 1.引言 规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。将各个阶段的决策综合起来构成一个决策序列,称为一个策略。显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。动态规划的主要创始人是美国数学家贝尔曼(Bellman)。20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。爱尔思先后于1961年和1964年出版了两部关于动态规划的著作,并于1964年同尼母霍思尔(Nemhauser)、威尔德(Wild)一道创建了处理分枝、循环性多阶段决策系统的一般性理论。梅特顿提出了许多对动态规划后来发展有着重要意义的基础性观点,并且对明晰动态规划路径的数

经典算法——动态规划教程

动态规划是对最优化问题的一种新的算法设计方法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。不存在一种万能的动态规划算法。但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。 多阶段决策过程最优化问题 ——动态规划的基本模型 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。 【例题1】最短路径问题。图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。具体计算过程如下: S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3 S2: K=3,有: F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8 F3(C2)=d3(C2,D1)+f4(D1)=5+3=8 F3(C3)=d3(C3,D3)+f4(D3)=8+3=11 F3(C4)=d3(C4,D3)+f4(D3)=3+3=6

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

动态规划讲解大全 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。 动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。 虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。 基本模型 多阶段决策过程的最优化问题。 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:(看词条图) 这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。 记忆化搜索 给你一个数字三角形, 形式如下: 1 2 3 4 5 6 7 8 9 10 找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大. 无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)} 对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

动 态 规 划 算 法 ( 2 0 2 0 )

01背包问题的动态规划算法、蛮力法和空间优化算法 算法思想: (1)【导师实战恋爱教-程】、动态规划算法:解决背包物品价值最大化问题的最优解,是建立在每一个子问题的最优解的前提下完成的。设Valu【扣扣】e[i,j]表示的是i个物品放进背包容量为j的背包的价值,令i从0【⒈】增至n(物品总数量),j从0增至c(背包总容量)。Value[n,c]就是我【О】们要的背包价值最大化的解。为了得到这个解必须要把之前的都解【1】决,每一个问题的最优解的算法又根据以下确定:当物品重【6】量w小于背包体积j时,此物品不放进背包,价值与上一次【⒐】价值相同;当物品重量w不小于背包体积j时,此物品是否放进背【5】包,取决于Value[i-1,j]和Value[i-1,j-w]+v的大小。写成表达式【2】则为以下内容: ? Va【б】lue[i-1,j]? weight[i]j Value[i,j] ? Max(Value[i-1,j],Value[i-1,j-w[i]]+v[i])? weight[i]=j 而这个表达式的约束条件就是当物品数量为0(i=0)时和背包容量为0(j=0)时,最大价值为0。 (2)、空间优化算法:动态规划法的空间复杂度为O(nw),现将空间复杂度优化到O(w)。我使用的方法为建立一个新的一维数组V[w+1],此数组与上述动态规划的Value数组不同的是只用于记录上一行的价值,如

当我需要求第i行的价值的时候,v数组中存放的是第i-1行的价值。然后从后往前(背包容量从c到0)计算价值、覆盖数组,因为每一次计算背包容量j大小的价值可能会用到j-w的价值,如果从前往后计算的话则数组已被更新,所以要从后往前计算。计算价值的方法也是和上面大致相同:如果物品体积w小于背包容量j,则判断V [j]和V[j-w]+v的大小;如果大于背包容量,则放不进去,V[j]价值不变。 写成表达式如下: ? V[j]? weight[i]j ? Max(V[j],V[j-w[i]]+value[i])? weight[i]=j 由于使用一维数组的方法,内容还一直被覆盖,所以无法得出背包中具体有哪些物品。 (3)、穷举法:用于验证动态规划方法是否正确。以n=4为例,创建一个v[4]的数组,用0和1表示第i个物品是否放进背包,如0001表示只有第四个物品放进背包。然后数组从0000~1111,计算每次摆放的重量以及价值。如果重量小于背包重量,且价值大于当前最大价值,则记录当前的最大价值以及数组。原理是这样在实施的时候为了记录背包的解,将0000和1111看成0和15的二进制形式,所以让i从0到15进行增长,每次将i转换成二进制格式放进数组中,这样做就可以记录最大价值时的i,转换成二进制则可获得具体物品。 伪代码如下: For i 0~2n-1

算法设计动态规划(编辑距离)

《算法设计与分析》课程报告 课题名称:动态规划——编辑距离问题 课题负责人名(学号): 同组成员名单(角色):无 指导教师:左劼 评阅成绩: 评阅意见: 提交报告时间:2010年 6 月 23 日

动态规划——编辑距离问题 计算机科学与技术专业 学生指导老师左劼 [摘要]动态规划的基本思想与分治法类似,也是将待求解的问题分解成若干份的子问题,先分别解决好子问题,然后从子问题中得到最终解。但动态规划中的子问题往往不是相互独立的,而是彼此之间有影响,因为有些子问题可能要重复计算多次,所以利用动态规划使这些子问题只计算一次。将字符串A变换为字符串所用的最少字符操作数称为字符串A到B的编辑距离。 关键词:动态规划矩阵字符串操作数编辑距离

一、问题描述 1、基本概念:设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。字符串操作包括: (1) 删除一个字符; (2) 插入一个字符; (3) 将一个字符改为另一个字符。 将字符串A变换为字符串B所用的最少字符操作数称为字符串A 到B的编辑距离,记为d(A,B)。 2、算法设计:设计一个有效算法,对于给定的任意两个字符串A 和B,计算其编辑距离d(A,B)。 3、数据输入:输入数据由文件名为input.txt的文本文件提供。文件的第1行为字符串A,第二行为字符串B。 4、结果输出:将编辑距离d(A,B)输出到文件ouput.txt的第一行。 输入文件示例输出文件示例 input.txt output.txt fxpimu 5 xwrs 二、分析 对于本问题,大体思路为:把求解编辑距离分为字符串A从0个字符逐渐增加到全部字符分别想要变为字符串B该如何变化以及变化的最短距离。 具体来说,首先选用数组a1存储字符串A(设长度为n),a2存储字符串B(设长度为m),d矩阵来进行具体的运算;这里有两个特殊情况比较简单可以单独考虑,即A的长度为0而B不为0还有A不为0B为0,这两种情况最后的编辑距离分别为m和n;讨论一般情况,d矩阵为d[n][m],假定我们从d[0][0]开始一直进行以下操作到了d[i][j]的位置,其中删除操作肯定是A比B长,同理,插入字符操作一定是A比B短,更改字符操作说明一样长,我们所要做的是对d[i][j-1]

动态规划习题

第七章动态规划 规划问题的最终目的就是确定各决策变量的取值,以使目标函数达到极大或极小。在线性规划和非线性规划中,决策变量都是以集合的形式被一次性处理的;然而,有时我们也会面对决策变量需分期、分批处理的多阶段决策问题。所谓多阶段决策问题是指这样一类活动过程:它可以分解为若干个互相联系的阶段,在每一阶段分别对应着一组可供选取的决策集合;即构成过程的每个阶段都需要进行一次决策的决策问题。将各个阶段的决策综合起来构成一个决策序列,称为一个策略。显然,由于各个阶段选取的决策不同,对应整个过程可以有一系列不同的策略。当过程采取某个具体策略时,相应可以得到一个确定的效果,采取不同的策略,就会得到不同的效果。多阶段的决策问题,就是要在所有可能采取的策略中选取一个最优的策略,以便得到最佳的效果。动态规划(dynamic programming)同前面介绍过的各种优化方法不同,它不是一种算法,而是考察问题的一种途径。动态规划是一种求解多阶段决策问题的系统技术,可以说它横跨整个规划领域(线性规划和非线性规划)。当然,由于动态规划不是一种特定的算法,因而它不象线性规划那样有一个标准的数学表达式和明确定义的一组规则,动态规划必须对具体问题进行具体的分析处理。在多阶段决策问题中,有些问题对阶段的划分具有明显的时序性,动态规划的“动态”二字也由此而得名。动态规划的主要创始人是美国数学家贝尔曼(Bellman)。20世纪40年代末50年代初,当时在兰德公司(Rand Corporation)从事研究工作的贝尔曼首先提出了动态规划的概念。1957年贝尔曼发表了数篇研究论文,并出版了他的第一部著作《动态规划》。该著作成为了当时唯一的进一步研究和应用动态规划的理论源泉。1961年贝尔曼出版了他的第二部著作,并于1962年同杜瑞佛思(Dreyfus)合作出版了第三部著作。在贝尔曼及其助手们致力于发展和推广这一技术的同时,其他一些学者也对动态规划的发展做出了重大的贡献,其中最值得一提的是爱尔思(Aris)和梅特顿(Mitten)。爱尔思先后于1961年和1964年出版了两部关于动态规划的著作,并于1964年同尼母霍思尔(Nemhauser)、威尔德(Wild)一道创建了处理分枝、循环性多阶段决策系统的一般性理论。梅特顿提出了许多对动态规划后来发展有着重要意义的基础性观点,并且对明晰动态规划路径的数学性质做出了巨大的贡献。 动态规划在工程技术、经济管理等社会各个领域都有着广泛的应用,并且获得了显著的效果。在经济管理方面,动态规划可以用来解决最优路径问题、资源分配问题、生产调度问题、库存管理问题、排序问题、设备更新问题以及生产过程最优控制问题等,是经济管理中一种重要的决策技术。许多规划问题用动态规划的方法来处理,常比线性规划或非线性规划更有效。特别是对于离散的问题,由于解析数学无法发挥作用,动态规划便成为了一种非常有用的工具。 动态规划可以按照决策过程的演变是否确定分为确定性动态规划和随机性动态规划;也可以按照决策变量的取值是否连续分为连续性动态规划和离散性动态规划。本教材主要介绍动态规划的基本概念、理论和方法,并通过典型的案例说明这些理论和方法的应用。 §7.1 动态规划的基本理论 1.1多阶段决策过程的数学描述 有这样一类活动过程,其整个过程可分为若干相互联系的阶段,每一阶段都要作出相应的决策,以使整个过程达到最佳的活动效果。任何一个阶段(stage,即决策点)都是由输入(input)、决策(decision)、状态转移律(transformation function)和输出(output)构成的,如图7-1(a)所示。其中输入和输出也称为状态(state),输入称为输入状态,输出称为输出状态。

动态规划算法

动态规划算法: 引言: 动态规划算法是求解最有问题的一种高效率的算法。其使用的原则是优化原则,即整体的最优解可以通过局部的最优解获得。问题求解的过程可以概括成两句话:自顶向下的分析,自下向上的计算。 典型例题 例1、数塔问题:设有一个三角形数塔,顶点节点称为根结点,每个节点有一个数值。从顶点出发,可以想左走也可以向右走。搜索从顶点出发向下走至塔底的所有路径中节点和最大的路径及最大和值。 问题分析: 1 选择最佳算法: 贪心算法----不能求最优解; 穷举算法----当塔层数很大时,计算量过大。 其它算法? 2 选择最佳数据结构表示数据: g[I,j,1]:表示为置[I,j]结点本身数值; g[I,j,2]:能取得的最大值; g[I,j,3]:前进方向,0---向下;1—向右下。 源程序: program d1; const n=5; var i,j:integer; g:array[1..n,1..n,1..3] of integer; begin for i:=1 to n do begin for j:=1 to i do begin read(g[i,j,1]); g[i,j,2]:=g[i,j,1];g[i,j,3]:=0; end; readln; end; for i:=n-1 downto 1 do for j:=1 to i do if g[i+1,j,2]>g[i+1,j+1,2] then g[i,j,2]:=g[i,j,2]+g[i+1,j,2] else begin g[i,j,2]:=g[i,j,2]+g[i+1,j+1,2]; g[i,j,3]:=1 end;

动态规划经典教程

动态规划经典教程 引言:本人在做过一些题目后对DP有些感想,就写了这个总结: 第一节动态规划基本概念 一,动态规划三要素:阶段,状态,决策。 他们的概念到处都是,我就不多说了,我只说说我对他们的理解: 如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。 下面举个例子: 要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。 一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。 经过这个例子相信大家对动态规划有所了解了吧。 下面在说说我对动态规划的另外一个理解: 用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。这样就形成了一个有向无环图AOE网(为什么无环呢?往下看)。对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。这样对图求最优路径就是动态规划问题的求解。 二,动态规划的适用范围 动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢? 一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件: 最优子结构(最优化原理) 无后效性 最优化原理在下面的最短路径问题中有详细的解答; 什么是无后效性呢? 就是说在状态i求解时用到状态j而状态j就解有用到状态k…..状态N。 而求状态N时有用到了状态i这样求解状态的过程形成了环就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。 也就是说当前状态是前面状态的完美总结,现在与过去无关。。。 当然,有是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。 三,动态规划解决问题的一般思路。 拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:(1)模型匹配法: 最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。这些基本模型在先面的分类中将一一介绍。 (2)三要素法 仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同: 先确定阶段的问题:数塔问题,和走路问题(详见解题报告) 先确定状态的问题:大多数都是先确定状态的。 先确定决策的问题:背包问题。(详见解题报告) 一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现。 (3)寻找规律法: 这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。 (4)边界条件法 找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。 (5)放宽约束和增加约束 这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。 第二节动态规划分类讨论

动态规划习题精讲

信息学竞赛中的动态规划专题 哈尔滨工业大学周谷越 【关键字】 动态规划动机状态典型题目辅助方法优化方法 【摘要】 本文针对信息学竞赛(面向中学生的Noi以及面向大学生的ACM/ICPC)中的动态规划算法,从动机入手,讨论了动态规划的基本思想和常见应用方法。通过一些常见的经典题目来归纳动态规划的一般作法并从理论上加以分析和说明。并介绍了一些解决动态规划问题时的一些辅助技巧和优化方法。纵观全文可知,动态规划的关键在于把握本质思想的基础上灵活运用。 【目录】 1.动态规划的动机和基本思想 1.1.解决重复子问题 1.2.解决复杂贪心问题 2.动态规划状态的划分方法 2.1.一维状态划分 2.2.二维状态划分 2.3.树型状态划分 3.动态规划的辅助与优化方法 3.1.常见辅助方法 3.2.常见优化方法 4.近年来Noi动态规划题目分析 4.1 Noi2005瑰丽华尔兹 4.2 Noi2005聪聪与可可 4.3 Noi2006网络收费 4.4 Noi2006千年虫 附录参考书籍与相关材料

1.动态规划的动机和基本思想 首先声明,这里所说的动态规划的动机是从竞赛角度出发的动机。 1.1 解决重复子问题 对于很多问题,我们利用分治的思想,可以把大问题分解成若干小问题,然后再把各个小问题的答案组合起来,得到大问题的解答。这类问题的共同点是小问题和大问题的本质相同。很多分治法可以解决的问题(如quick_sort,hanoi_tower等)都是把大问题化成2个以内的不相重复的小问题,解决的问题数量即为∑(log2n / k)。而考虑下面这个问题: USACO 1.4.3 Number Triangles http://122.139.62.222/problem.php?id=1417 【题目描述】 考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 在上面的样例中,从7到3到8到7到5的路径产生了最大和:30。 【输入格式】 第一个行包含R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。 【输出格式】 单独的一行包含那个可能得到的最大的和。 【样例输入】 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 【样例输出】 30 显然,我们同样可以把大问题化成小问题来解决。如样例中最底层的6就可以从次底层

动态规划算法的应用

动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、实验步骤 (1)需求分析 通过动态规划法解决数塔问题。从顶部出发,在每一节点可以选择向下或者向右走,一直走到底层,以找出一条数值最大的路径。 (2)概要设计 本次实验程序主要用到二维数组,以及通过动态规划法进行比较每个数的大小。主要运用两个for循环语句实现动态规划。

(3)详细设计 第一步,输入给定的二维数组并打印出相应的数组: int array[5][5]={{9}, /* */{12,15}, /* */{10,6,8}, /* */{2,18,9,5}, /* */{19,7,10,4,6}}; int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) cout<0;j--) { for(i=0;i<=4;i++) { if(array[j][i]>array[j][i+1]) array[j-1][i]=array[j][i]+array[j-1][i]; else array[j-1][i]=array[j][i+1]+array[j-1][i]; } } 第三步,输出最大路径的值。 cout<

动态规划典型例题

1、单调递增最长子序列 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0

2、最长公共子序列 描述 如题,需要写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 输入 第一行给出一个整数N(0

3、括号匹配 时间限制:1000 ms | 内存限制:65535 KB 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符, S的长度不超过100 输出 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组 测试输出占一行 样例输入 4 [] ([])[] ((] ([)] 样例输出 3 2

动态规划经典案例详解(背包问题)

动态规划经典案例详解之背包问题 【摘要】本文主要从动态规划经典案例——背包问题的动态规划设计思路出发,结合具体实例,对动态规划在程序设计中的典型应用以及衍生拓展进行详细分析。 【关键字】动态规划信息学奥赛0/1背包问题 动态规划并非一个算法,而是一种解题的思路,其核心思想是通过使用大量的存储空间把中间结果记录下来,大大减少重复计算的时间,从而提高的程序的执行效率,因为信息学奥林匹克复赛题目的解决程序一般是有时间限制的,对于某些用搜索必然耗费大量时间的题目,动态规划几乎是唯一的选择。但是动态规划并没有一个简单的模型可以套用,对于每个不同的题目都有对应的不同规划思路,我们只能通过对一些动态规划经典案例的学习来训练自己的动态规划思维能力,从而以不变应万变,应付各种复杂的程序设计,本文通过对动态规划经典案例之一的背包问题进行详细阐述,旨在让学生了解动态规划和搜索的不同设计思路以及动态规划的优越性。 【原型例题】 从n个物品中选取装入背包的物品,每件物品i的重量为wi,价值为pi。求使物品价值最高的选取方法。 【输入文件】 第一行一个数c,为背包容量。 第二行一个数n,为物品数量 第三行n个数,以空格间隔,为n个物品的重量 第四行n个数,以空格间隔,为n个物品的价值 【输出文件】 能取得的最大价值。 【分析】 初看这类问题,第一个想到的会是贪心,但是贪心法却无法保证一定能得到最优解,看以下实例: 贪心准则1:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。例如,考虑n=2,w=[100,10,10],p=[20,15,15],c=105。当利用价值贪婪准则时,获得的解为x=[1,0,0],这种方案的总价值为20。而最优解为[0,1,1],其总价值为30。 贪心准则2:从剩下的物品中选择可装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n=2,w=[10,20], p=[5,100],c=25。当利用重量贪婪策略时,获得的解为x=[1,0],比最优解[0,1]要差。

动态规划算法实验报告

实验标题 1、矩阵连乘 2、最长公共子序列 3、最大子段和 4、凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树 实验目的掌握动态规划法的基本思想和算法设计的基本步骤。 实验内容与源码1、矩阵连乘 #include #include using namespace std; const int size=4; //ra,ca和rb,cb分别表示矩阵A和B的行数和列数 void matriMultiply(int a[][4],int b[][4],int c[][4],int ra ,int ca,int rb ,int cb ) { if(ca!=rb) cerr<<"矩阵不可乘"; for(int i=0;i

动态规划习题完整版

动态规划习题 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

动态规划专题分类视图数轴动规题: 题1.2001年普及组第4题--装箱问题 【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0

对于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行,为每堆石子质量。 【输出】输出文件szgb.out的只有一行,该行只有一个整数,表示最小的质量差. 【样例输入】 5 5 8 13 27 14 【样例输出】 3 题4.补圣衣 【问题描述】有四个人,每人身上的衣服分别有s1,s2,s3和s4处破损,而且每处破损程度不同,破损程度用需修好它用的时间表示 (A1...As1,B1...Bs2,C1...Cs3,D1...Ds4)。不过你可以同时修补2处破损。但是这2处破损,只能是同一件衣服上的。就是说你只能同时修补一件衣服,修好了,才能修补下一件。 【输入】本题包含5行数据:第1行,为s1,s2,s3,s4(1≤s1,s2,s3,s4≤20) 第2行,为A1...As1共s1个数,表示第一件衣服上每个破损修好它所需的时间 第3行,为B1...Bs2共s2个数,表示第二件衣服上每个破损修好它所需的时间 第4行,为C1...Cs3共s3个数,表示第三件衣服上每个破损修好它所需的时间 第5行,为D1...Ds4共s4个数,表示第四件衣服上每个破损修好它所需的时间 (1≤A1...As1,B1...Bs2,C1...Cs3,D1...Ds4≤60) 【输出】输出一行,为修好四件衣服所要的最短时间。 【样例输入】 1213 5 43 6 243 【样例输出】 20 题5.光光的作业homework.pas/homework.exe 【问题描述】光光上了高中,科目增多了。在长假里,光光的老师们都非常严厉,都给他布置了一定量的作业。假期里,光光一共有的时间是k小时。在长假前,老师们一共给光光布置了n份作业,第i份作业需要的时间是ti小时。但是由于老师们互相不

动态规划算法设计

算法设计与分析实验报 告 决实际问题。 1、天平平衡问题:已知一个天平左右两端共有n个挂钩,且 有m个不同质量的钩码,求将钩码全部挂到钩子上使天平平衡 的方法的总数。试设计求解该问题的动态规划算法。 2、数塔问题:对于诸如下图的数塔,若从顶层走到底层,每 一步只能走到相邻的结点,求经过的结点的数字之和最大的路 径。试设计求解该问题的动态规划算法。 1.天平平衡问题的解题思路或算法思想:

1. 天平平衡问题的程序: package com.t7; public class Tianping{ public static void main(String[] args) { int m = 27; //全部钩码的重量之和的二分之一,问题中的n int n = 9; //钩码的数量,即题目中的m(个钩码) int a[] = {10,9,8,7,6,5,4,3,2}; int h[] =new int[1001]; h[0]=1; for (int i = 1; i <=n; i++) { for (int j = m; j >=1; j--) { if(j>=a[i-1]){ h[j]=h[j]+h[j-a[i-1]]; } } } for (int j = 0; j <=m; j++) System.out.print(h[j]+""); } } 实例: 2. 数塔问题的程序: package com.t4; import java.util.Scanner; public class Main { public static void main(String [] args){ System.out.print("输入数组的层数: "); Scanner scan=new Scanner(System.in); int n=scan.nextInt();//定义数塔层数n; int d[][]=new int[n][n]; System.out.print("输入数组元素:"); for(int i=0;i=j) d[i][j]=scan.nextInt(); } } int result = dataTower(d);

相关文档