1、动态规划题目及其代码动态规划题目及其代码 By LYLtim1、数塔问题(tower.pas)设有一个三角形的数塔,如下图所示。顶点结点称为根结点,每个结点有一个整数数值。从顶点出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。【样例输入】tower.in5 数塔层数1311 812 7 266 14 15 812 7 13 24 11【样例输出】tower.outmax=86【参考程序】uses math;var n,i,j:byte; a:array1.10,1.10of word; f:array1.10,1.10of word;begin as
2、sign(input,tower.in);reset(input); assign(output,tower.out);rewrite(output); readln(n); for i:=1 to n do begin for j:=1 to i do read(ai,j); readln; end; fillchar(f,sizeof(f),0); for i:=1 to n do fn,i:=an,i; for i:=n-1 downto 1 do for j:=1 to i do fi,j:=max(fi+1,j,fi+1,j+1)+ai,j; writeln(max=,f1,1);
3、close(input);close(output);end.2、拦截导弹(missile.pas) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。【样例输入】 missile.in 389 207 155 300 29
4、9 170 158 65 【输出样例】missile.out6(最多能拦截的导弹数)2(要拦截所有导弹最少要配备的系统数)【参考程序】type node=record h,lens:word;end;var n,i,j,maxl,num,minsys:word; mis:arraywordof node; sysl:arraywordof word;begin assign(input,missile.in);reset(input); assign(output,missile.out);rewrite(output); while not eoln do begin inc(n); rea
5、d(misn.h); misn.lens:=1; end; for i:=2 to n do beginfor j:=1 to i-1 do if(misj.hmisi.h)and(misj.lens+1misi.lens) thenmisi.lens:=misj.lens+1;if misi.lensmaxl then maxl:=misi.lens; end; writeln(maxl); num:=1; sysl0:=maxint; sysl1:=mis1.h; for i:=2 to n do begin minsys:=0;for j:=1 to num doif(syslj=mis
6、i.h)and(syslj0)and(aj.dismaxint)and(aj.dis+mapi,jai.dis)then while ai do begin dis:=aj.dis+mapi,j; pre:=j; end; writeln(dis=,a1.dis); x:=1; while ax.pre0 do begin write(x, ); x:=ax.pre; end; writeln(x); close(output);end.4、挖地雷(Mine.pas)在一个地图上有N个地窖(N=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的。某人可以
7、从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。【输入格式】N 地窖的个数W1,W2,WN 每个地窖中的地雷数X1,Y1 表示从X1可到Y1X2,Y20 ,0 表示输入结束【输出格式】K1K2Kv 挖地雷的顺序MAX 最多挖出的地雷数【输入样例】Mine.in65 10 20 5 4 51 21 42 43 44 54 65 60 0【输出样例】Mine.out3-4-5-634【参考程序】var n,start:byte; w:array1.200of word; g:array1.200,1.200of
8、 boolean; f:array1.200of longword; next:array1.200of byte; max:longword;procedure init;var i,x,y:byte;begin assign(input,mine.in);reset(input); readln(n); for i:=1 to n do read(wi); readln; readln(x,y); fillchar(g,sizeof(g),false); while(x0)and(y0)do begin gx,y:=true; readln(x,y); end; close(input);
9、end;initprocedure work;var i,j:byte;begin fillchar(f,sizeof(f),0); fn:=wn; fillchar(next,sizeof(next),0); for i:=n-1 downto 1 do begin for j:=i+1 to n do if(gi,j)and(fjfi)then begin fi:=fj; nexti:=j; end; inc(fi,wi); end; max:=0; for i:=1 to n do if fimax then begin max:=fi; start:=i; end;end;workpr
10、ocedure print;begin assign(output,mine.out);rewrite(output); write(start); while nextstart0 do begin write(-,nextstart); start:=nextstart; end; writeln; writeln(max); close(output);end;printbeginmain init; work; print;end.5、轮船问题(ship.pas)【问题描述】某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有
11、相同的友好城市。每一对友好城市都希望有一条航线来往,于是他们向政府提出了申请。由于河终年有雾。政府决定允许开通的航线就互不交叉(如果两条航线交叉,将有很大机会撞船)。兴建哪些航线以使在安全条件下有最多航线可以被开通。 【输入格式】输入文件(ship.in):包括了若干组数据,每组数据格式如下: 第一行两个由空格分隔的整数x,y,10=x=6000,10=y=100。x表示河的长度而y表示宽。第二行是一个整数N(1=N1.c; repeat while apl.cm do dec(pr); if plpr; if pll then qsort(l,pr);end;qsortprocedure w
12、ork;var i,j:word;begin for i:=2 to n do begin for j:=1 to i-1 do if(aj.dai.l)then ai.l:=aj.l+1; if ai.lmaxl then maxl:=ai.l; end;end;workprocedure print;begin assign(output,ship.out);rewrite(output); writeln(maxl); close(output);end;printbeginmain init; qsort(1,n); work; print;end.7、砝码称重(weight.pas)
13、设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重1000g),要求:【输入格式】a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,.20g砝码有a6个)【输出格式】Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)【输入样例】weight.in1 1 0 0 0 0【输出样例】weight.outTotal=3,表示可以称出1g,2g,3g三种不同的重量【参考程序】const wt:array1.6of shortint=(1,2,3,5,10,20);var n:array1.6of word; vis:arra
14、y0.1000of boolean; w:array0.1000of word; i,j,k,nw:word;begin assign(input,weight.in);reset(input); assign(output,weight.out);rewrite(output); fillchar(vis,sizeof(vis),false); for i:=1 to 6 do read(ni); w0:=1;w1:=0; for i:=1 to 6 do for j:=1 to w0 do for k:=1 to ni do begin nw:=wj+wti*k; if not visnw
15、 then begin visnw:=true; inc(w0); ww0:=nw; end; end; writeln(Total=,w0-1); close(input);close(output);end.8、装箱问题(boxes.pas)有一个箱子容量为v(正整数,0v20000),同时有n个物品(0n30),每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。【输入格式】箱子的容量v 物品数n接下来n行,分别表示这n个物品的体积【输出格式】 箱子剩余空间【输入样例】boxes.in2468312797【输出样例】boxes.out0 【参考程序
16、】var v,j,cost:word; n,i:byte; c:array1.30of word; f:array0.20000of boolean;begin assign(input,boxes.in);reset(input); assign(output,boxes.out);rewrite(output); readln(v); readln(n); for i:=1 to n do readln(ci); close(input); fillchar(f,sizeof(f),false); f0:=true; for i:=1 to n do for j:=v downto ci
17、do if fj-ci then fj:=true; cost:=v; while not fcost do dec(cost); writeln(v-cost); close(output);end.9、合唱队形(Chorus.pas)N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, , K,他们的身高分别为T1, T2, , TK,则他们的身高满足T1 T2 Ti+1 TK (1iK)。已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。【输入文件】输入
18、文件chorus.in的第一行是一个整数N(2 N 100),表示同学的总数。第二行有n个整数,用空格分隔,第i个整数Ti(130 Ti 230)是第i位同学的身高(厘米)。【输出文件】输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。【样例输入】chorus.in8186 186 150 200 160 130 197 220【样例输出】chorus.out4【参考程序】type node=record h,ups,downs:byte; end;var n,i,j,max:byte; stu:array1.100of node;begin assign(
19、input,chorus.in);reset(input); assign(output,chorus.out);rewrite(output); readln(n); for i:=1 to n do begin stui.ups:=1;stui.downs:=1; read(stui.h); end; close(input); for i:=2 to n do for j:=1 to i-1 doif(stuj.hstui.ups)thenstui.ups:=stuj.ups+1; for i:=n-1 downto 1 do for j:=i+1 to n doif(stuj.hstui.downs) then stui.downs:=stuj.downs+1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1