线性类动态规划2_第1页
线性类动态规划2_第2页
线性类动态规划2_第3页
线性类动态规划2_第4页
线性类动态规划2_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最长上升序列

设有整数序列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)最大上升子序列输入:整数序列。输出:最大长度n和所有长度为n的序列个数。分析设f(i)为前i个数中的最长上升序列长度

,则f(i)=max{f(j)+1}(1<=j<i<=m,bj<bi)边界为F(1)=1分析设t(i)为前i个数中最长序列的个数,则t(i)=∑t(j)(1<=j<i<=m,bj<bi,f(i)=f(j+1))初始为t(i)=1当f(i)=n时,将t(i)累加举例:

1234658109f:123455677t:111111222答案:f=7时,边界为∑t=4进一步(3)求本质不同的最长序列个数有多少个?如:1234658109有,

12346810,12345810,1234689,1234589

都是本质不同的。但对于

1223354f:1223344t:1112244

答案有8个,其中4个1235,4个1234改进算法上例显然对于相两个相同的数,重复算了多次因此,我们对算法进行改进:对原序列按b从小到大(当bi=bj时按F从大到小)排序,增设Order(i)记录新序列中的i个数在原序列中的位置。可见,求t(i)时,当f(j)=f(j+1),b(j)=b(j+1)且Order(j+1)<Order(i)时,便不累加t(j)。这样就避免了重复。

上述算法的时间复杂度为O(n2)添括号问题

有一个由数字1,2,...,9组成的数字串(长度不超过200),问如何将M(M<=20)个加号("+")插入到这个数字串中,使所形成的算术表达式的值最小。请编一个程序解决这个问题。注意:加号不能加在数字串的最前面或最末尾,也不应有两个或两个以上的加号相邻。M保证小于数字串的长度。例如:数字串79846,若需要加入两个加号,则最佳方案为79+8+46,算术表达式的值133。分析考虑到数据的规模超过了长整型,我们注意在解题过程中采用高精度算法.规划方程:F[I,J]=MIN{F[I-1,K]+NUM[K+1,J]}(I-1<=K<=J-1)边界值:F[0,I]:=NUM[1,I] ;F[I,J]表示前J个数字中添上I个加号后得到的最小值。NUM[I,J]表示数字串第I位到第J位的数上述问题的每一步,都只与上一步有关。因此可以采用滚动数组程序的时间效率约为20*200*200演唱会一场演唱会即将举行。现有N(O<N<=200)个歌迷排队买票,一个人买一张,而售票处规定,一个人每次最多只能买两张票。假设第I位歌迷买一张票需要时间Ti(1〈=I〈=n),队伍中相邻的两位歌迷(第j个人和第j+1个人)也可以由其中一个人买两张票,而另一位就可以不用排队了,则这两位歌迷买两张票的时间变为Rj,(假如Rj<Tj+Tj+1,则这样做就可以缩短后面歌迷等待的时间,加快整个售票的进程)。现给出N,Ti和Ri,求使每个人都买到票的最短时间和方法。分析设f(i)为前i个人花费最短时间于是有

f(i)=min{f(i-1)+Ti,f(i-2)+Ri-1},初始f(0)=0,f(1)=T1复制书稿假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。任务:将这M本书分给K个抄写员(K<=M)每本书只能分配给一个抄写员进行抄写,而每个抄写员所分配到的书必须是连续顺序的。输出复制最短时间。复制时间为抄写页数最多的人用去的时间分析设F(I,J)为前I个抄写员复制前J本书的最小“页数最大数”。于是有

F(I,J)=MIN{F(I-1,V),T(V+1,J)}(1<=I<=K,I<=J<=M-K+I,I-1<=V<=J-1〉。其中T(V+1,J)表示从第V+1本书到第J本书的页数和。起步时F(1,1)=P1。多米诺骨牌有一种多米诺骨牌是平面的,其正面被分成上下两部分,每一部分的表面或者为空,或者被标上1至6个点。现有一行排列在桌面上:例如,顶行骨牌的点数之和为6+1+1+1=9;底行骨牌点数之和为1+5+3+2=11。顶行和底行的差值是2。这个差值是两行点数之和的差的绝对值。每个多米诺骨牌都可以上下倒置转换,即上部变为下部,下部变为上部。现在的任务是,以最少的翻转次数,使得顶行和底行之间的差值最小。分析以骨牌序列上下两部分的差值I作为状态,把达到这一状态的翻转步数作为状态值,记为f(I)。于是有

f(I)=min{f(I+J)+1}(-12<=J<=12,J为偶数,且要求当前状态有差值为J/2的骨牌)。这里,I不是无限增大或减小,其范围取决于初始骨牌序列的数字差的和的大小。系统可靠性

一个系统由若干部件串联而成,只要有一个部件故障,系统就不能正常运行,为提高系统的可靠性,每一部件都装有备用件,一旦原部件故障,备用件就自动进入系统。显然备用件越多,系统可靠性越高,但费用也越大,那么在一定总费用限制下,系统的最高可靠性等于多少?给定一些系统备用件的单价Ck,以及当用Mk个此备用件时部件的正常工作概率Pk(Mk),总费用上限C。求系统可能的最高可靠性。

输入文件格式:第一行:nC第二行:C1P1(0)P1(1)…P1(X1)(0<=X1<=[C/Ck])

…第n行:CnPn(0)Pn(1)…Pn(Xn)(0<=Xn<=[C/Cn])分析例:输入:220 30.60.650.70.750.80.850.950.70.750.80.80.90.95

输出:0.6375设F[I,money]表示将money的资金用到前I项备用件中去的最大可靠性,则有

F[I,money]=max{F[I-1,money–k*Cost[I]]*p[I,k]}(0<=I<=n,0<=K<=moneydivCost(I))初始:F[0,0]=0目标:F[n,C]=0航空旅行给定一张航空图,图中的顶点代表城市,边代表两城市的直通航线。现要求找出一条满足下述限制条件的、含城市最多的旅游路线:1.从最西的一个城市出发,单方向从西向东途经若干城市到达最东的一个城市,然后再单方向从东向西飞回起点(可途经若干城市);2.除起点城市外,任何城市只能访问一次,起点城市被访问两次:出发一次,返回一次。分析设f[i,j]表示顶点i至顶点N与顶点j至顶点N的两条路线的最多顶点数,很容易得出,f[N,N]=1,f[i,N]=2(当该阶段中顶点i与顶点N间有直通航线),a[i,j]=a[j,i]。这样,可以得到以下关系式:f[i,j]=max{f[k,j]+1,f[i,j]}(k<>j且边(k,i)存在且a[k,j]<>0)时间复杂度为O(N3)f[i,j]=max{f[i,k]+1,f[i,j]}(k<>j且边(k,I)存在且a[k,j]<>0)积木游戏有N块长方体积木,编号依次为1,2,…,N。第i块长宽高分别为ai,bi,ci(i=1,2,…,N),要从中选出若干块,将他们摞成M(1<=M<=N<=100)根柱子,要求:对于每一根柱子,一定要满足下面三个条件:除最顶上的一块积木外,任意一块积木的上表面同且仅同另一块积木的下表面接触;对于任意两块上下表面相接触的积木,若m,n是下面一块积木接触面的两条边(m>=n),x,y是上面一块积木接触面的两条边(x>=y),则一定满足m.>=x和n>=y;下面的积木的编号要小于上面的积木的编号。请你编一程序,寻找一种游戏方案,使得所有能摞成的M根柱子的高度之和最大。分析设(1)f[i,j,k]表示以第i块积木的第k面为第j根柱子的顶面的最优方案的高度总和;(2)block[i,k]记录每个积木的三条边信息(block[i,4]:=block[i,1];block[i,5]:=block[i,2])。其中block[i,j+2]表示当把第i块积木的第j面朝上时所对应的高,即所增加的高度;(3)can[i,k,p,kc]表示第I块积木以其第k面朝上,第p块积木以第kc面朝上时,能否将积木I放在积木p的上面。1表示能,0表示不能。对于f[i,j,k],有两种可能:

1.除去第i块积木,第j根柱子的最上面的积木为编号为p的,若第p块积木以第kc面朝上,必须保证当第I块积木以k面朝上时能够被放在上面,即can[i,k,p,kc]=1;

2.第i块积木是第j根柱子的第一块积木,第j-1根柱子的最上面为第p块积木,则此时第p块积木可以以任意一面朝上。动态规划边界条件:f[1,1,1]:=block[1,1,3];f[1,1,2]:=block[1,1,4];f[1,1,3]:=block[1,1,5];f[i,0,k]:=0;(1<=i<=n,1<=k<=3);时间复杂度为O(n2*m)石子合并在一园形操场四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆.规定每次只能选相临的两堆合并成一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆数N及每堆石子数(≤20), (1)选择一种合并石子的方案,使得做N-1次合并,得分的总和最少(2)选择一种合并石子的方案,使得做N-1次合并,得分的总和最大示例贪心法N=5石子数分别为346542。用贪心法的合并过程如下:第一次346542得分5第二次54654得分9第三次9654得分9第四次969得分15第五次159得分24第六次24总分:62然而仔细琢磨后,发现更好的方案:第一次346542得分7第二次76542得分13第三次13542得分6第四次1356得分11第五次1311得分24第六次24总分:61显然,贪心法是错误的。动态规划用data[i,j]表示将从第i颗石子开始的接下来j颗石子合并所得的分值,max[i,j]表示将从第i颗石子开始的接下来j颗石子合并可能的最大值,那么:max[i,j]=max(max[i,k]+max[i+k,j–k]+data[i,k]+data[i+k,j–k])(2<=k<=j)max[i,1]=0同样的,我们用min[i,j]表示将第从第i颗石子开始的接下来j颗石子合并所得的最小值,可以得到类似的方程:min[i,j]=min(min[i,k]+min[i+k,j–k]+data[i,k]+data[i+k,j–k])(0<=k<=j)min[i,0]=0这样,我们完美地解决了这道题。时间复杂度也是O(n2)。多边形

多角形是一个单人玩的游戏,开始时有一个N个顶点的多边形。如图,这里N=4。每个顶点有一个整数标记,每条边上有一个“+”号或“*”号。边从1编号到N。第一步,一条边被拿走;随后各步包括如下:选择一条边E和连接着E的两个顶点V1和V2;得到一个新的顶点,标记为V1与V2通过边E上的运算符运算的结果。最后,游戏中没有边,游戏的得分为仅剩余的一个顶点的值。样例写一个程序,对于给定一个多边形,计算出可能的最高得分,并且列出得到这个分数的过程。分析

分析我们先枚举第一次删掉的边,然后再对每种状态进行动态规划求最大值用f(i,j)表示从j开始,进行i次删边操作所能得到的最大值,num(i)表示第i个顶点上的数,若为加法,那么:进一步分析最后,我们允许顶点上出现负数。以前的方程还适不适用呢?这个例子的最优解应该是(3+2)*(-9)*(-5)=250,然而如果沿用以前的方程,得出的解将是((-10)*3+2)*(-5)=140。为什么?我们发现,两个负数的积为正数;这两个负数越小,它们的积越大。我们从前的方程,只是尽量使得局部解最大,而从来没有想过负数的积为正数这个问题。-932-5**图六+最终?我们引入函数fmin和fmax来解决这个问题。fmax(i,j)表示从j开始,进行i次删边操作所能得到的最大值,fmin(i,j)表示从j开始,进行i次删边操作所能得到的最小值。当OP=‘+’Fmax(i,j)=max{fmax(i,k)+fmax(k+1,j)}Fmin(i,j)=min{fmin(i,k)+fmin(k+1,j)}完美解决初始值

Fmax(i,i)=num(i)Fmin(i,i)=num(i)到此为止,整个问题圆满解决了。算法的空间复杂度为O(n2),算法时间复杂度为O(n4)(先要枚举每一条边,然后再用复杂度为O(n3)的动态规划解决)。BlocksJimmy最近迷上了一款叫做方块消除的游戏.游戏规则如下:n个带颜色方格排成一列,相同颜色的方块连成一个区域(如果两个相邻的方块颜色相同,则这两个方块属于同一个区域).游戏时,你可以任选一个区域消去.设这个区域包含的方块数为x,则将得到x2的分值.方块消去之后,右边的方格将向左移动.虽然游戏很简单,但是要得到高分也不是很容易.Jimmy希望你帮助他找出最高可以得到多少分N<200.Sample如图,依次消去灰,白,黑区域,你将得到42+32+22=29分,这是最高得分.

算法分析合并颜色序列,如

11133244455

根据方块消除的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论