动态规划练习题及解答1.docx

上传人:b****5 文档编号:7254616 上传时间:2023-01-22 格式:DOCX 页数:14 大小:22.88KB
下载 相关 举报
动态规划练习题及解答1.docx_第1页
第1页 / 共14页
动态规划练习题及解答1.docx_第2页
第2页 / 共14页
动态规划练习题及解答1.docx_第3页
第3页 / 共14页
动态规划练习题及解答1.docx_第4页
第4页 / 共14页
动态规划练习题及解答1.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

动态规划练习题及解答1.docx

《动态规划练习题及解答1.docx》由会员分享,可在线阅读,更多相关《动态规划练习题及解答1.docx(14页珍藏版)》请在冰豆网上搜索。

动态规划练习题及解答1.docx

动态规划练习题及解答1

动态规划练习题

 

[题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天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"375080"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:

第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.

输出:

对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.

样例输入:

样例输出:

36460

21301500

375080

712011001001101200

460706050

30135140

27080

23

2070

180

00

 

[题3]复制书稿(BOOKS)

问题描述:

假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。

任务时将这M本书分给K个抄写员(K〈=M〉,每本书只能分配给一个抄写员进行复制,而每个抄写员所分配到的书必须是连续顺序的。

意思是说,存在一个连续升序数列0=bo〈b1〈b2〈…

复制工作是同时开始进行的,并且每个抄写员复制的速度都是一样的。

所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。

试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小(如存在多个最优方案,只输出其中一种)。

输入格式:

文件的第一行是两个整数m和k(1〈=k〈=m〈=500)。

第二行有m个整数P1,P2,…,Pm,这m个整数均为正整数且都不超过1000000。

每两个整数之间用空格分开。

输出格式:

文件有k行,每行有两个正整数。

整数之间用空格分开。

第I行的两个整数ai和bi,表示第I号抄写员所分配得到的书稿的起始编号与终止编号。

动态规划题参考程序:

题1:

解决问题:

例子的上下部分之差是6+1+1+1-(1+5+3+2)=(6-1)+(1-5)+(1-3)+(1-2)=-2,而翻转最后一个骨牌后,上下之差变为(6-1)+(1-5)+(1-3)+(2-1)=0。

由此看出,一个骨牌对翻转策略造成影响的是上下两数之差,骨牌上的数则是次要的了。

这么一来,便把骨牌的放置状态由8个数字变为4个:

5-4-2-1,翻转时只需取该位数字的相反数就行了。

在本题中,因为各骨牌的翻转顺序没有限定,所以不能按骨牌编号作为阶段来划分。

怎么办呢?

考虑到隐含阶段类型的问题可以按状态最优值的大小来划分阶段。

于是,我们以骨牌序列上下两部分的差值I作为状态,把达到这一状态的翻转步数作为状态值,记为f(I)。

便有f(I)=min{f(I+j)+1}(-12〈=j<=12,j为偶数,且要求当前状态有差值为j/2的骨牌)。

这里,I不是无限增大或减小,其范围取决于初始骨牌序列的数字差的和的大小。

具体动态规划时,如例题,我们以f(-2)=0起步,根据骨牌状态,进行一次翻转,可得到f(-12)=1,f(6)=1,f

(2)=1,f(0)=1,由于出现了f(0),因此程序便可以结束,否则将根据四个新状态继续扩展,直至出现f(0)或者无法生成新状态为止。

注意:

在各状态,除记录最少步数外,还需记录到达这一状态时各骨牌的放置情况;而当到达某一状态发现已记录有一种翻转策略时,则取步数较小的一种。

程序如下:

programdomino;

typetp=array[1..6]ofinteger;

vart:

array[1..6000]of^tp;

{记录骨牌摆放状态}

f:

array[-6000..6000]ofinteger;

{记录达到某个差值的最少步数}

l:

array[1..6000]ofinteger;

{扩展队列}

tt:

tp;

i,j,n,m,x,y,ft,re:

integer;

f1,f2:

text;

procedureinit;

{程序初始化}

begin

assign(f1,'domino.dat');

reset(f1);

assign(f2,'domino.out');

rewrite(f2);

m:

=0;

ft:

=0;re:

=1;new(t[1]);

fillchar(t[1]^,sizeof(t[1]^),0);

fillchar(f,sizeof(f),0);

fillchar(tt,sizeof(tt),0);

readln(f1,n);

fori:

=1tondo

begin

readln(f1,x,y);

ifx<>ythen

begin

x:

=x-y;

inc(m,x);

inc(tt[abs(x)]);

ifx>0theninc(t[1]^[x]);

end;

end;

ifm=0then

begin

writeln(f2,0);

close(f2);

halt;

end;

{处理步数为零的情况}

l[1]:

=m;

f[m]:

=1;

end;

proceduremain;

{主过程}

begin

repeat

forft:

=ft+1toredo

{以步数为阶段扩展状态}

begin

x:

=l[ft];

fori:

=1to6do

{不同差值的六种情况}

begin

ifx<6then

if(t[ft]^[i]

begin

inc(re);l[re]:

=x+i*2;

f[l[re]]:

=f[x]+1;

ifl[re]=0then

{找到解便打印}

begin

writeln(f2,f[l[re]]-1);

close(f2);

halt;

end;

new(t[re]);

t[re]^:

=t[ft]^;

inc(t[re]^[i]);

end;

{差值增加}

ifx>-6then

if(t[ft]^[i]>0)and(f[x-i*2]=0)then

begin

inc(re);l[re]:

=x-i*2;

f[l[re]]:

=f[x]+1;

ifl[re]=0then

{找到解便打印}

begin

writeln(f2,f[l[re]]-1);

close(f2);

halt;

end;

new(t[re]);

t[re]^:

=t[ft]^;

dec(t[re]^[i]);

end;

{差值减少}

end;

end;

untilft=re;

fori:

=1to6do

if(f[i]>0)or(f[-i]>0)then

begin

if(f[-i]>0)and((f[i]=0)or(f[-i]

=f[-i]

elsex:

=f[i];

writeln(f2,x-1);

i:

=6;

end;

close(f2);

{骨牌上下两行点数之和的绝对值不为零}

end;

begin

init;

main;

end.

 

题2:

初看这道题,很容易便可以想到动态规划,因为第x天在第y个地方的最优值只与第x-1天有关,符合动态规划的无后效性原则,即只与上一个状态相关联,而某一天x航班价格不难求出S=C[(x-1)modm+1].我们用天数和地点来规划用一个数组A[1..1000,1..10]来存储,A[i,j]表示第i天到达第j个城市的最优值,C[i,j,l]表示i城市与j城市间第l天航班价格,则A[i,j]=Min{A[i-1,l]+C[l,j,i](l=1..n且C[l,j,i]<>0)},动态规划方程一出,尽可以放怀大笑了.

示范程序:

programperform_hh;

var

f,fout:

text;

p,l,i,j,n,k:

integer;

a:

array[1..1000,1..10]ofinteger;{动态规划数组}

c:

array[1..10,1..10]ofrecord{航班价格数组}

num:

integer;

t:

array[1..30]ofinteger;

end;

e:

array[1..1000]ofinteger;

procedurework;

begin

{人工赋第一天各城市最优值}

fori:

=1tondo

begin

ifc[1,i].t[1]<>0

thena[1,i]:

=c[1,i].t[1];

end;

fori:

=2tokdo

begin

forj:

=1tondo

begin

forl:

=1tondo

begin

if(j<>l)

and(c[l,j].t[(i-1)modc[l,j].num+1]<>0){判断存在航班}

and((a[i,j]=0)or(a[i-1,l]+c[l,j].t[(i-1)modc[l,j].num+1]

thena[i,j]:

=a[i-1,l]+c[l,j].t[(i-1)modc[l,j].num+1];{赋值}

end;

end;

end;

e[p]:

=a[k,n];{第p个场景的最优值}

end;

procedurereadfile;{读文件}

begin

assign(f,'PERFORM.DAT');reset(f);

assign(fout,'PERFORM.OUT');rewrite(fout);

readln(f,n,k);p:

=0;

while(n<>0)and(k<>0)do

begin

p:

=p+1;

fillchar(c,sizeof(c),0);

fillchar(a,sizeof(a),0);

fori:

=1tondo

begin

forj:

=1toi-1do

begin

read(f,c[i,j].num);

forl:

=1toc[i,j].numdo

read(f,c[i,j].t[l]);

end;

forj:

=i+1tondo

begin

read(f,c[i,j].num);

forl:

=1toc[i,j].numdo

read(f,c[i,j].t[l]);

end;

end;

work;

readln(f,n,k);

end;

{输出各个场景的解}

fori:

=1top-1do

writeln(fout,e[i]);

write(fout,e[p]);

close(f);

close(fout);

end;

begin

readfile;

end.

[题3:

]

解决问题:

该题中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。

观察函数递推式,发现F(I)阶段只依赖于F(I-1)阶段的状态值,编程时可令数组F的范围为(0…1,1…M),便于缩小空间复杂度。

程序如下:

 

programbooks;

typetp=array[1..500]ofinteger;

tc=array[1..500]oflongint;

varc:

array[1..500]of^tp;

{记录路径}

f:

array[0..1]oftc;

{状态值}

t:

tc;

{书本页数和}

cc:

tp;

{链接路径}

i,j,v,k,m,x,y,min,p1,p2:

longint;

f1,f2:

text;

procedureinit;

{输入部分}

begin

assign(f1,'books.dat');

reset(f1);

assign(f2,'books.out');

rewrite(f2);

readln(f1,m,k);

ifk=1then

begin

writeln(f2,1,'',m);

close(f2);

halt;

end;

{当k=1时,作特殊处理}

fori:

=1tomdo

begin

read(f1,j);

ifi=1thent[1]:

=jelse

t[i]:

=t[i-1]+j;

{累加页数}

end;

fori:

=1tokdo

new(c[i]);

end;

proceduremain;

{主过程}

begin

p1:

=1;f[1]:

=t;

{起步状态}

fori:

=2tok-1do

{利用函数递推式计算}

begin

p2:

=p1;p1:

=1-p2;

forj:

=itom-k+ido

begin

min:

=maxlongint;y:

=0;

forv:

=i-1toj-1do

begin

iff[p2,v]>t[j]-t[v]thenx:

=f[p2,v]elsex:

=t[j]-t[v];

ifx

=x;y:

=v;end;

end;

f[p1,j]:

=min;

c[i]^[j]:

=y;

end;

end;

p2:

=p1;p1:

=1-p2;

min:

=maxlongint;y:

=0;

fori:

=k-1tom-1do

begin

iff[p2,i]>t[m]-t[i]thenx:

=f[p2,i]elsex:

=t[m]-t[i];

ifx

=x;y:

=i;end;

end;

{最后找出最优分配方案}

fori:

=k-1downto1do

begin

cc[i]:

=y;

y:

=c[i]^[y];

end;

{链接路径}

writeln(f2,1,'',cc[1]);

forj:

=2tok-1do

writeln(f2,cc[j-1]+1,'',cc[j]);

writeln(f2,cc[k-1]+1,'',m);

close(f2);

{打印}

end;

begin

init;

main;

end.

 

合同管理制度

1范围

本标准规定了龙腾公司合同管理工作的管理机构、职责、合同的授权委托、洽谈、承办、会签、订

阅、履行和变更、终止及争议处理和合同管理的处罚、奖励;

本标准适用于龙腾公司项目建设期间的各类合同管理工作,厂内各类合同的管理,厂内所属各具法人资格的部门,参照本标准执行。

2规范性引用

《中华人民共和国合同法》

《龙腾公司合同管理办法》

3定义、符号、缩

略语

4职责

4.1总经理:

龙腾公司经营管理的法定代表人。

负责对厂内各类合同管理工作实行统一领导。

以法人代表名义或授权委托他人签订各类合法合同,并对电厂负责。

4.2工程部:

是发电厂建设施工安装等工程合同签订管理部门;负责签订管理基建、安装、人工技术的工程合同。

4.3经营部:

是合同签订管理部门,负责管理设备、材料、物资的订购合同。

4.5合同管理部门履行以下职责:

4.5.1建立健全合同管理办法并逐步完善规范;

4.5.2参与合同的洽谈、起草、审查、签约、变更、解除以及合同的签证、公证、调解、诉讼等活动,全程跟踪和检查合同的履行质量;

4.5.3审查、登记合同对方单位代表资格及单位资质,包括营业执照、经营范围、技术装备、信誉、越区域经营许可等证件及履约能力(必要时要求对方提供担保),检查合同的履行情况;

4.5.4保管法人代表授权委托书、合同专用章,并按编号归口使用;

4.5.5建立合同管理台帐,对合同文本资料进行编号统计管理;

4.5.6组织对法规、制度的学习和贯彻执行,定期向有关领导和部门报告工作;

4.5.7在总经理领导下,做好合同管理的其他工作,

4.6工程技术部:

专职合同管理员及材料、燃料供应部兼职合同管理员履行以下职责:

4.6.1在主任领导下,做好本部门负责的各项合同的管理工作,负责保管“法人授权委托书”;

4.6.2签订合同时,检查对方的有关证件,对合同文本内容依照法规进行检查,检查合同标的数量、金额、日期、地点、质量要求、安全责任、违约责任是否明确,并提出补充及修改意见。

重大问题应及时向有关领导报告,提出解决方案;

4.6.3对专业对口的合同统一编号、登记、建立台帐,分类整理归档。

对合同承办部门提供相关法规咨询和日常协作服务工作;

4.6.4工程技术部专职合同管理员负责收集整理各类合同,建立合同统计台帐,并负责

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1