动态规划练习题(含答案)

合集下载

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

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

5动态规划演算法习题答案1.最大子段和问题:给定整数序列,求该序列形如的子段和的最大值:1)已知一个简单演算法如下:int maxsum(int n,int a,int}试分析该演算法的时间複杂性。

2) 试用分治演算法解最大子段和问题,并分析演算法的时间複杂性。

3)试说明最大子段和问题具有最优子结构性质,并设计一个动态规划演算法解最大子段和问题。

分析演算法的时间複杂度。

(提示:令)解:1)分析按照第一章,列出步数统计表,计算可得 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]的最大子段和为两部分的栏位和组成,即;intmaxsubsum ( int *a, int left , int right)int s2 =0;int right_sum =0;for ( int i = center +1; i sum)sum = b;j=i;end}return sum;}自行推导,答案:时间複杂度为o(n)。

2.动态规划演算法的时间複杂度为o(n)(双机排程问题)用两台处理机a和b处理个作业。

设第个作业交给机器a处理时所需要的时间是,若由机器b来处理,则所需要的时间是。

现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。

设计一个动态规划演算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。

以下面的例子说明你的演算法:解:(思路一)在完成前k个作业时,设机器a工作了x 时间,则机器b此时最小的工作时间是x的一个函式。

设f[k][x]表示完成前k个作业时,机器b最小的工作时间,则其中对应第k个作业由机器b来处理(完成k-1个作业时机器a工作时间仍是x,则b在k-1阶段用时为);而对应第k个作业由机器a处理(完成k-1个作业,机器a工作时间是x-a[k],而b完成k阶段与完成k-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天对应的两个城市的航班的价格,价格为零表示那天两个城市之间没有航班.例如"3 75 0 80"表示第一天机票价格是75KOI,第二天没有航班,第三天的机票是80KOI,然后循环:第四天又是75KOI,第五天没有航班,如此循环.输入文件由n=k=0的场景结束.输出:对每个场景如果乐团可能从城市1出发,每天都要飞往另一个城市,最后(经过k天)抵达城市n,则输出这k个航班价格之和的最小值.如果不可能存在这样的巡回演出路线,输出0.样例输入: 样例输出:3 6 4602 130 150 03 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 32 0 701 800 0[题3] 复制书稿(BOOKS)问题描述:假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。

动态规划试题

动态规划试题

动态规划试题动态规划装箱问题(01背包):有⼀个箱⼦容量为VV(正整数,0≤V≤20000),同时有n个物品(024 68 3 12 7 9 7输出:0f[j]=max(f[j],f[j-w[i]]+w[i]);f[j] 为:当总容量为j 时,不放第i 件物品,所能装的最⼤体积。

f[j-w[i]]+w[i] 为:当总容量为j 时,放了第i 件物品后,所能装的最⼤体积。

(即j减去第i 件物品体积的容量能装的最⼤体积+第i 件物品的体积。

w[i] 为第i 件物品体积)背包的种类:背包分为01背包,多重背包以及完全背包这三种基本模型,其他的背包问题都是从这3种背包中延申出来的。

完全背包的模板题⾯是这样的:设有n种物品,每种物品有⼀个重量及⼀个价值。

但每种物品的数量是⽆限的,同时有⼀个背包,最⼤载重量为M,今从n种物品中选取若⼲件(同⼀种物品可以⽆限选取),使其重量的和⼩于等于M,⽽价值的和为最⼤。

完全背包[⽆限量]的采摘药输⼊:70 371 10069 11 2输出:140每个数组在满⾜条件,可以遍历多次01背包实现代码:采药-传送门输⼊:70 371 10069 11 2输出:3每个数组遍历⼀遍题⽬描述⾦明今天很开⼼,家⾥购置的新房就要领钥匙了,新房⾥有⼀间他⾃⼰专⽤的很宽敞的房间。

更让他⾼兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就⾏”。

今天⼀早⾦明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。

于是,他把每件物品规定了⼀个重要度,分为5等:⽤整数1-5表⽰,第5等最重要。

他还从因特⽹上查到了每件物品的价格(都是整数元)。

他希望在不超过N元(可以等于N 元)的前提下,使每件物品的价格与重要度的乘积的总和最⼤。

设第jj件物品的价格为v_[j],重要度为w_[j],共选中了k件物品,编号依次为j_1,j_2,…,j_k,则所求的总和为:w_[j_k]v[j1]×w[j1]+v[j2]×w[j2]+…+v[jk]×w[jk]。

动态规划习题

动态规划习题

动态规划专题分类视图数轴动规题: (1)较复杂得数轴动规 (4)线性动规 (7)区域动规: (14)未知得动规: (20)数轴动规题:题1、2001年普及组第4题--装箱问题【问题描述】有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。

要求从n个物品中,任取若干个装入箱内,使箱子得剩余空间为最小。

【输入格式】输入文件box、in有若干行。

第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品得各自体积。

【输出格式】输出文件box、out只有一行数据,该行只有一个数,表示最小得箱子剩余空间。

【输入样例】2468312797【输出样例】题2、1996年提高组第4题--砝码秤重 __数据加强版【问题描述】设有n种砝码,第k种砝码有C k个,每个重量均为W k,求:用这些砝码能秤出得不同重量得个数,但不包括一个砝码也不用得情况。

【输入格式】输入文件weight、in得第一行只有一个数n,表示不同得砝码得种类数、第2行至第n+1行,每行有两个整数、第k+1行得两个数分别表示第k种砝码得个数与重量、【输出格式】输出文件weight、out中只有一行数据:Total=N。

表示用这些砝码能秤出得不同重量数。

【输入样例】22 22 3【输出样例】Total=8【样例说明】重量2,3,4,5,6,7,8,10都能秤得【数据限制】对于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堆石子。

动态规划习题答案汇编

动态规划习题答案汇编

2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。

问怎样分配资金,使总效益值最大?##表8-47解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。

为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k∈D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3∈D3(S3)S4=S3-X3第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)}X2∈D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)}X1∈D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。

总收益164百万元。

3.(最优分配问题)有一个仪表公司打算向它的3个营业区设立6家销售店。

每个营业区至少设一家,所获利润如表。

问设立的6家销售店数应如何分配,可使总利润最大?解:s k——对k#,…,3#营业区允许设立的销售店数x k——对k#营业区设立的销售店数w k (s k,x k)——对k#营业区设立x k销售店后的利润:w k (s k,,x k)= w k (x k)T k (s k, x k)——s k +1= s k - x kf k (s k)——当第k至第3个营业区允许设立的销售店数为s k 时所能获得的最大利润递归方程:f4(s4)=0f k (s k)=max {wk (xk)+ fk+1(sk+1)}, k=3,2,1 xk∈Dk(sk)k=3时,有方程f4 (s4)=0f3(s3)= max {w3(x3)+ f4(s4) }x3∈D3(s3)s3=s2—x2k=2,有方程f2(s2)= max {w2(x2)+ f3(s3) }x2∈D2(s2)s3=s2—x2k=1,有方程f1(s1)= max{w1(x1)+ f2(s2) } x1∈D1(s1) s2=s1—x1s1=6 → s2=3 → s3=2 ↓ ↓ ↓x1*=3 x2*=1 x3*=2分别A1、A2、A3营业区设立3家、1家、2家销售店,最大利润为7704.用动态规划方法求解下列模型:maxf=10X1+4X2+5X3s.t. 3X1+5 X2+4 X3≤150≤X1≤2 0≤X2≤2 X3≥0 ,X j为整数j=1,2,3解:收费C1=10 C2=4 C3=5X1为货物1的装载件数X2为货物2的装载件数X3为货物3的装载件数分3阶段S1为货物1、2、3允许的装载重量(3X1+5 X2+4 X3的允许值)S2为货物2、3允许装载的重量(5 X2+4 X3的允许值)S3 为货物3允许装载的重量(4 X3的允许值)第一步:K=3f4(S4)=0f3(S3)= max{5X3+ f4(S4)| X3∈D3(S3)}S4= S3 -4 X3第二步:K=2f2(S2)= max{4X2+ f3(S3)| X2∈D2(S2)} S3= S2 -5 X2划分点:第三步:K=1f1(S3)= max{10X1+ f2(S2)| X1∈D1(S1)}S2= S1-3 X110X1+ f2(S1-3 X1)顺序追踪:最优策略为S1=15 →S2=9 →S3=9↓↓↓X1*=2 X2*=0 X3*=2最优装载方案为:货物1装2件;货物2不装;货物3装2件装载收费为30元5.用动态规划方法解下列0—1背包问题:Max f =12x1+12x2+9x3+16x4+30x5;s.t. 3x1+4x2+3x3+4x4+6x5≤12;x j=0,1, j=1,……,5解:本问题分为5个阶段。

运筹学 动态规划-作业及答案

运筹学 动态规划-作业及答案

1
第五章 动态规划作业题及答案
1.用动态规划法求解求最短路径
从起点A 到终点E 之间各点的距离如图所示。

求A 到E 的最短路径。

B A
C B
D B C D E
C 21
23
12
31
2
5
11214
10610
41312113
96
5810
5
2
2.用动态规划法求解资源分配问题
有资金4万元,投资A 、B 、C 三个项目,每个项目的投资效益与投入该项目的资金有关。

三个项目A 、B 、C 的投资效益(万吨)和投入资金(万元)的关系见下表:
用动态规划法求解对三个项目的最优投资分配,使总投资效益最大。

3.用动态规划法求解生产库存问题
一个工厂生产某种产品,1~7月份生产成本和产品需求量的变化情况如下表:
为了调节生产生产和需求,工厂设有一个产品仓库,库容量H=9。

已知期初库存量为2,要求期末(七月低)库存量为0。

每个月生产的产品在月末入库,月初根据当月需求发货。

求七个月的生产量,能满足各月的需求,并使生产成本最低。

4.用动态规划法求解背包问题
第i 种每件价值c 1=65,c 2=85,c 3=40元; 第i 种物品每件重量为:w 1=2,w 2=3,w 3=1公斤;现有一只可装载重量为5公斤的背包,求各种物品应各取多少件放入背包,使背包中物品的价值最高。

动态规划习题答案

动态规划习题答案

2.某公司有资金4百万元向A,B和C3个项目追加投资,各个项目可以有不同的投资额(百万元计),相应的效益如表所示。

问怎样分配资金,使总效益值最大?##表8-47W k (X k)投资额(项目k#012341#(A)-414860662#(B )40425060-3#(C)-64687884解:设S1-A,B,C项目的总投资额,S2-B、C项目的总投资额S3-C项目的投资额;X k-k项目的投资额;(X1-A项目的投资额,X2-B项目的投资额,X3-C项目的投资额)W k(S k,X k)-对K项目投资X k后的收益:W k(S k,X k)=W k (X k)T k (S k,X k)-S k+1=S k-X kf k (S k)-当K至第3项目允许的投资额为S k时所能获得的最大收益。

为获得最大利润,必须将4百万全部投资,假设有4阶段存在,有S4=0,建立递归方程f4 (S k)=0f k (S k)=max{ W k (X k)+f k +1(S k+1)} k=3,2,1X k∈D k(S k)第一步,K=3f4(S4)=0f3 (S3)=max{W3 (X3)+f4 (S4)}X3∈D3(S3)S4=S3-X3S3f3 (S3)X3* 1641268237834844第二步:K=2 f2 (S2)=max{W2 (X2)+f3 (S3)}X2∈D2(S2)S3=S2-X2W2 (X2)+f3 (S2-X2)S2X2 =0X2 =1X2 =2X2 =3f2 (S2)X2 * 140+64---1040 240+6842+64--1080 340+7842+6850+64-1180 440+8442+7850+6860+641240,3第三步:K=1 f1 (S1) =max {W1 (X1)+ f2 (S2)}X1∈D1(S1)S2= S1- X1W1 (X1)+ f2 (S1- X1)S1X1=0X1=1X1=2X1=3f1 (S1)X1 * 4-41+118 48+10860+1041643S1=4 →S2=1 →S3=1↓↓↓X1*=3 X2*=0 X3*=1A投资3百万,B不投资C投资1百万。

动态规划专项练习(1)

动态规划专项练习(1)

动态规划专项练习(1)动态规划专项练习(1)1、警卫安排(security.pas/c/cpp)一个重要的基地被分为n个连通的区域。

出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布。

在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望见其相邻的区域,只要一个区域被一个警卫望见或者是安排有警卫,这个区域就是安全的。

你的任务是:在确保所有区域都是安全的情况下,找到安排警卫的最小费用。

输入数据第一行n,表示树中结点的数目。

接下来的n行描述了n个区域的信息,每一行包含的整数依次为:区域的标号i(0<i<=n),在区域i安排警卫的费用k,区域i的子结点数目m,接下来m个数为区域i p="" 的子结点编号。

<=""> 输出数据一行一个整数,为最小的安排费用。

样例输入:security.in61 30 323 42 16 2 5 63 5 04 4 05 11 06 5 0输出security.out25数据范围对于所有的数据,0<n<=720。

< p="">2、最长上升子序列(LIS.pas/c/cpp)LIS问题是最经典的动态规划基础问题之一。

如果要求一个满足一定条件的最长上升子序列,你还能解决吗?给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列。

例如:对于长度为6的序列<2,7,3,4,8,5>,它的最长上升子序列为<2,3,4,5>,但如果限制一定要包含第2个元素,那么满足此要求的最长上升子序列就只能是<2,7,8>了。

输入数据第一行为两个整数N,K,如上所述。

接下来是N个整数,描述一个序列。

输出数据请输出一个整数,即包含第K个元素的最长上升子序列长度。

样例输入8 665 158 170 299 300 155 207 389输出4数据范围对于所有的数据,满足0<n<=200000,0<k<=n< p="">3、最短回文串(palindrome.pas/c/cpp)如果一个字符串正过来读和倒过来读是一样的,那么这个字符串就被称作回文串。

运筹学动态规划习题

运筹学动态规划习题
习题三
一、某工厂购进100台机器,准备生产A、B 两种产品。如生产产品A,每台机器每年可 收入45万元,损坏率为65%;若生产产品B, 每台机器每年可收入35万元,损坏率为 35%;估计三年后有新机器出现,旧的机 器将全部淘汰。试问每年应然后安排生产, 使在三年内收入最多?
答案: 第一年将100台机器全部生产产品B,第二年 将余下的机器生产产品B,第三年把所有的 机器生产产品A。三年的总收入为7676.25 万元。
二、某厂有100台机床,能够加工两种零件, 要安排4个月的任务,根据以往经验,用这 些机床加工第一种零件,一个月后损坏率 为1/3;加工第二种零件时,一个月后损坏 率为1/10。又已知机床加工第一种零件时一 个月的受益为10万元,机床加工第二种零 件时一个月的受益为7万元。现安排4个月 的任务,使总收益为最大。
பைடு நூலகம்
• 答案: • 设每个月为一个阶段,共4个阶段。每个阶 段可投入生产的机床数为状态变量SK,加 工第一种零件的机床数为决策变量UK,加 工第二种零件的机床数为SK-UK,阶段指标 函数为DK=7SK+3UK,SK+1=9/10SK-7/30UK。 用逆序的递推方法求解:前两月全部加工 第二种零件,后两月全部加工第一种零件。 其最大收益为2680
• 首先建立动态规划的模型 • 划分成3个阶段,每个阶段决策一个项目 的投资额,每个阶段决策的投资时可以使 用的资金作为状态变量,利润为阶段的指 标函数。 • 利用基本递推方程从第3阶段开始求解 • 给企业的投资额为 95万元 在城市购买房 地产的投资额为 105万元 • 最大利润为 681万元
三、某公司有资金200万元,打算全部参与三 个方面的投资。(1)参与一个企业投资, 当投资额为X1(万元)时,可得利润为 J1=4X1-2(万元);(2)参与一个电视片 制作,当投资额为X2(万元)时,可得利 润为J2=1/16X2-1/5X2-2(万元);(3)在 城市购买房地产,当投资额为X3(万元) 时,可得利润为J3=3X3-10(万元)。又知 投资额的上限为X1≤95万元;X2≤50万元。 用动态规划法决策使总利润最大?

动态规划作业完整

动态规划作业完整

动态规划作业完整 The document was finally revised on 2021动态规划作业1、1、设某工厂自国外进口一部精密机器,由机器制造厂至出口港有三个港口可供选择,而进口港又有三个可供选择,进口后可经由两个城市到达目的地,其间的运输成本如图中所标的数字,试求运费最低的路线?2、把A看作终点,该问题可分为4个阶段。

f k(S k)表示从第K阶段点S k到终点A的最短距离。

f4(B1)=20,f4(B2)=40,f4(B3)=30f3(C1)=min[d3(C1, B1)+ f4(B1), d3(C1, B2)+ f4(B2), d3(C1, B3)+f4(B3) ]=70,U3(C1)= B2 或B3f3(C2)=40 ,U3(C2)= B3f3(C3)=80 ,U3(C3)= B1或B2 或B3f2(D1)=80 ,U2(D1)= C1f2(D2)=70 ,U2(D2)= C2f1(E)=110 ,U1(E)= D1或D2所以可以得到以下最短路线,E→D1→C1→B2 / B3→AE→D2→C2→B3→A3、习题4-2解:1)将问题按地区分为三个阶段,三个地区的编号分别为1、2、3;2)设Sk表示为分配给第k个地区到第n个地区的销售点数,Xk表示为分配给第k个地区的销售点数,S k+1=S k-X kPk(Xk)表示为Xk个销售点分到第k个地区所得的利润值fk(Sk)表示为Sk个销售点分配给第k个地区到第n个地区的最大利润值3)递推关系式:fk(Sk)=max[ Pk(Xk)+ f k+1(S k-X k) ] k=3,2,1f4(S4)=04)从最后一个阶段开始向前逆推计算第三阶段:设将S3个销售点(S3=0,1,2,3,4)全部分配给第三个地区时,最大利润值为:f3(S3)=max[P3(X3)] 其中X3=S3=0,1,2,3,4表1第二阶段:设将S2个销售点(S2=0,1,2,3,4)分配给乙丙两个地区时,对每一个S2值,都有一种最优分配方案,使得最大盈利值为:f2(S2)=max[ P2(X2)+ f3(S2-X2) ]其中,X2=0,1,2,3,4表2第一阶段:设将S1个销售点(S1=4)分配给三个地区时,则最大利润值为:f1(S1)=max[ P1(X1)+ f2(4-X1) ]其中,X1=0,1,2,3,4表3然后按计算表格的顺序反推,可知最优分配方案有两个:最大总利润为531)由X1*=2,X2*=1,X3*=1。

运筹学:动态规划、图与网络优化习题与答案

运筹学:动态规划、图与网络优化习题与答案

一、判断题1.动态规划分为线性动态规划和非线性动态规划。

()正确答案:×2.对于一个动态规划问题,应用顺推法和逆推法可能会得到不同的最优解。

()正确答案:×3.在用动态规划解题时,定义状态时应保证各个阶段中所做的决策的相互独立性。

()正确答案:√4.动态规划计算中的“维数障碍”主要是由问题中阶段数的急剧增加而引起的。

()正确答案:×二、选择题1.关于图论中图的概念,以下叙述()正确。

A.图中的有向边表示研究对象,结点表示衔接关系。

B.图中的点表示研究对象,边表示点与点之间的关系。

C.图中任意两点之间必有边。

D.图的边数必定等于点数减1。

正确答案:B2. 关于树的概念,以下叙述()正确。

A.树中的点数等于边数减1B.连通无圈的图必定是树C.含n个点的树是唯一的D.任一树中,去掉一条边仍为树。

正确答案:B3. 一个连通图中的最小树()。

A.是唯一确定的B.可能不唯一C.可能不存在D.一定有多个。

正确答案:B4.关于最大流量问题,以下叙述()正确。

A.一个容量网络的最大流是唯一确定的B.达到最大流的方案是唯一的C.当用标号法求最大流时,可能得到不同的最大流方案D.当最大流方案不唯一时,得到的最大流量应相同。

正确答案:D5. 图论中的图,以下叙述()不正确。

A.图论中点表示研究对象,边或有向边表示研究对象之间的特定关系。

B.图论中的图,用点与点的相互位置,边的长短曲直来表示研究对象的相互关系。

C.图论中的边表示研究对象,点表示研究对象之间的特定关系。

D.图论中的图,可以改变点与点的相互位置。

只要不改变点与点的连接关系。

正确答案:C6. 关于最小树,以下叙述()正确。

A.最小树是一个网络中连通所有点而边数最少的图B.最小树是一个网络中连通所有的点,而权数最少的图C.一个网络中的最大权边必不包含在其最小树内D.一个网络的最小树一般是不唯一的。

正确答案:B7.关于可行流,以下叙述()不正确。

动态规划模拟试卷及答案

动态规划模拟试卷及答案

动态规划模拟试卷及答案模拟试卷——第三章动态规划一、填空题(每小题4分,共20分)1、动态规划算法的基本要素是()和()。

2、()是动态规划法的变形。

3、()是最大子段和问题想二维的推广。

4、矩阵连乘问题的算法可由()设计实现。

5、动态规划算法中,通常不同子问题的个数随问题大小呈()增长。

二、简答题(每小题6分,共30分)1、写出设计动态规划算法的主要步骤。

2、简述什么是备忘录方法。

3、简述备忘录法与动态规划法的异同。

4、简述动态规划算法的基本思想。

5. 写出最长公共子序列问题具有的性质。

三、综合题(每小题25分,共50分)1、用动态规划算法实现最长公共子序列问题。

2、用动态规划算法实现下列问题:设A和B是两个字符串。

我们要用最少的字符操作将字符串A转换为字符串B,这里所说的字符操作包括:(1)删除一个字符;(2)插入一个字符;(3)将一个字符改为另一个字符。

将字符串A变换为字符串B所用的最少字符操作数称为字符串A 到B的编辑距离,记为d(A,B)。

试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。

答案一、填空题1、最优子结构、子问题重叠2、备忘录方法3、最大子矩阵的问题4、动态规划法5、多项式二、简答题1、(1)找出最优解的性质,并刻画其结构特征;(2)递归地定义最优解;(3)以自底向上的方法计算出最优值;(4)根据计算最优值时得到的信息,构造最优解。

2、备忘录方法是动态规划算法的变形。

备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

3、与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解此子问题时,只要简单地查看该子问题的解答,而不必重新计算。

与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。

4、动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

经典的动态规划入门练习题

经典的动态规划入门练习题

动态规划入门练习题1.石子合并在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.编一程序,由文件读入堆栈数N及每堆栈的石子数(<=20).(1)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最小;(2)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最大;输入数据:第一行为石子堆数N;第二行为每堆的石子数,每两个数之间用一个空格分隔.输出数据:从第一至第N行为得分最小的合并方案.第N+1行是空行.从第N+2行到第2N+1行是得分最大合并方案.每种合并方案用N行表示,其中第i行(1<=i<=N)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可).要求将待合并的两堆石子数以相应的负数表示.输入输出范例:输入:44 5 9 4输出:-459-4-8-59-13-9224-5-944-14-4-4-1822最小代价子母树设有一排数,共n个,例如:22 14 7 13 26 15 11.任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的和称为总代价,给出一种归并算法,使总代价为最小.输入、输出数据格式与“石子合并”相同。

输入样例:412 5 16 4输出样例:-12-516417-16-4-17-20372.背包问题设有n种物品,每种物品有一个重量及一个价值。

但每种物品的数量是无限的,同时有一个背包,最大载重量为XK,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于XK,而价值的和为最大。

输入数据:第一行两个数:物品总数N,背包载重量XK;两个数用空格分隔;第二行N个数,为N种物品重量;两个数用空格分隔;第三行N个数,为N种物品价值; 两个数用空格分隔;输出数据:第一行总价值;以下N行,每行两个数,分别为选取物品的编号及数量;输入样例:4 102 3 4 71 3 5 9输出样例:122 14 13.商店购物某商店中每种商品都有一个价格。

动态规划习题集全

动态规划习题集全

动态规划专题训练护卫队【问题描述】护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥。

因为街道是一条单行道,所以任何车辆都不能超车。

桥能承受一个给定的最大承载量。

为了控制桥上的交通,桥两边各站一个指挥员。

护卫车队被分成几个组,每组中的车辆都能同时通过该桥。

当一组车队到达了桥的另一端,该端的指挥员就用电话通知另一端的指挥员,这样下一组车队才能开始通过该桥。

每辆车的重量是已知的。

任何一组车队的重量之和不能超过桥的最大承重量。

被分在同一组的每一辆车都以其最快的速度通过该桥。

一组车队通过该桥的时间是用该车队中速度最慢的车通过该桥所需的时间来表示的。

问题要求计算出全部护卫车队通过该桥所需的最短时间值。

【输入格式】输入文件中的第一行包含三个正整数(用空格隔开),第一个整数表示该桥所能承受的最大载重量(用吨表示),第二个整数表示该桥的长度(用千米表示),第三个整数表示该护卫队中车辆的总数(n<1000)。

接下来的几行中,每行包含两个正整数W和S(用空格隔开),W表示该车的重量(用吨表示),S表示该车过桥能达到的最快速度(用千米/小时表示)。

车子的重量和速度是按车子排队等候时的顺序给出的。

【输出格式】输出文件中应该是一个实数,四舍五入精确到小数点后1位,表示整个护卫车队通过该桥所需的最短时间(用分钟表示)。

【输入输出样例】输入:100 5 1040 2550 2050 2070 1012 509 7049 3038 2527 5019 70输入:75.0DOLLARS【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。

编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。

【输入格式】输入文件中的第一行是一个自然数N(1<=N<=100),表示戴维学习汇率的天数。

接下来的N行中每行是一个自然数A(1<=A<=1000)。

第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。

动态规划算法题(5题)

动态规划算法题(5题)

动态规划算法题(5题)1、题⽬描述(⽹易)有 n 个学⽣站成⼀排,每个学⽣有⼀个能⼒值,⽜⽜想从这 n 个学⽣中按照顺序选取 k 名学⽣,要求相邻两个学⽣的位置编号的差不超过d,使得这 k 个学⽣的能⼒值的乘积最⼤,你能返回最⼤的乘积吗?输⼊描述:每个输⼊包含 1 个测试⽤例。

每个测试数据的第⼀⾏包含⼀个整数 n (1 <= n <= 50),表⽰学⽣的个数,接下来的⼀⾏,包含 n 个整数,按顺序表⽰每个学⽣的能⼒值 ai(-50 <= ai <= 50)。

接下来的⼀⾏包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:输出⼀⾏表⽰最⼤的乘积。

试题分析:本题要使⽤动态规划来解,动态规划的特点:1.求解的是最优化问题;2.可以分解为最优⼦结构本题可以先求解在第i个学⽣的位置下,j(j<K)个学⽣的能⼒值的最⼤值,得到所有学⽣位置下j个学⽣的能⼒值的最⼤值;在j个学⽣的情况下,得到j+1个学⽣的最⼤值,样例输出: 10 8 7 2 -7 9 5 4 10 -7 1 3 3输出: 630如上,第⼀步先计算k=2的情况:7:在d=3的情况下,最⼤最⼩值都为562:在d=3的情况下,最⼤值为16,最⼩值为14-7:在d=3的情况下,最⼤值为-14,最⼩值为-56......得到第⼀趟的结果k=3的情况下(这⾥以第⼀趟的结果为基础,只有这样就不需要考虑第⼀趟中d=3的限制):2:在d=3的情况下,最⼤最⼩值都为112(56*2)-7:在d=3的情况下,最⼤值为-98(14*-7)最⼩值为-392(56*-7)9:在d=3的情况下,最⼤值为504(56*9)最⼩值为-504(-56*9)......得到第⼆趟的结果返回最⼤值就是最后的结果#-*- coding:utf-8 -*-n=input()array=[int(i) for i in raw_input().split()]k,d=[int(i) for i in raw_input().split()]# n=36array_max=array_min=array#轮询k-1趟即可for i in range(0,k-1):_max=[-float('inf')]*n#将最⼤值的数组赋值⽆穷⼩_min=[float('inf')]*n#将最⼩值的数组赋值⽆穷⼤for j in range(i+1,n):if j<=d+i:#下⾯对应的min、max都是考虑到array[j]为负值的情况下temp_max = max(max(ii*array[j] for ii in array_max[i:j]),max(ii*array[j] for ii in array_min[i:j]))temp_min = min(min(ii*array[j] for ii in array_max[i:j]),min(ii*array[j] for ii in array_min[i:j]))else:temp_max = max(max(ii*array[j] for ii in array_max[j-d:j]),max(ii*array[j] for ii in array_min[j-d:j]))temp_min = min(min(ii*array[j] for ii in array_max[j-d:j]),min(ii*array[j] for ii in array_min[j-d:j]))_max[j]=temp_max_min[j]=temp_minarray_max=_maxarray_min=_minprint array_maxprint array_minprint max(array_max)2、题⽬描述(腾讯):腾讯⼤厦有39层,你⼿⾥有两颗⼀抹⼀眼的玻璃珠。

动态规划模拟题及答案

动态规划模拟题及答案

动态规划测试题一:填空题(每空2分,共20分)1.动态规划算法的步骤是(找出最优解的性质,并刻画其结构特征)、(递归地定义最优值)(以自底向上的方式计算最优值)、(根据计算最优值时得到的信息构造最优解)。

2.为方便起见、将矩阵连乘积A i A i+1……A j简记为(A[i:j] )。

3.动态规划算法的两个基本要素是(最优子结构性质)和(重叠子问题性质)。

4.矩阵连乘问题的算法可由(递归)设计实现。

5.对于矩阵连乘问题、设计算A[i:j]、1≤i≤j≤n,所需要的最少数乘次数为m[i][j],则原则问题的最优值为(m[1][n] )。

6. 动态规划算法的基本思想是将待求解问题分解成若干(子问题),先求解(子问题),然后从这些(子问题)的解得到原问题的解。

二:综合题(第一题5分其余各题15分,共50分)1.补充下面的最大子段和动态规划算法。

int MaxSum(int n,int *a){int sum=0,b=0;for(int i=1;i<=n;i++){if(b>0){b+=a[i];besti=1;}else b=a[i];if(b>sum){sum=b;bestj=i;}}return sum;}2. 0—1背包问题:有5种物品,背包的容量为c=10,物品i的重量为wi,其价值为vi:(w1,v1)=(2,6) (w2,v2)=(2,3) (w3,v3)=(6,5) (w4、v4)=(5,4)(w5,v5)=(4,6), 求最优解及最优值。

解∵p[5+1]={(0,0)}又∵(w5,w5)=(4,6)∴q[5+1]=p[5+1]○+(4,6)={(4,6)}则p[5]=m5j-其中的受控点={(0,0),(4,6)}又∵(w4,v4)=(5,4)∴q[5]○+(w4,v4)={(0,0),(4,6)}○+(5,4)={(5,4),(9,10)}∴w4j=p[5]∨q[5]={(0,0),(4,6),(5,4),(9,10)}又∵(w3,v3)=(6,5)∴q[4]=p[4]○+(w3,v3)={(6,5),(10,11)}∴m3j=p[4]∨q[4]={(0,0),(4,6),(6,5),(9,10),(10,11)} 则p[3]=m3j-其中的受控点={(0,0),(4,6),(9,10),(10,11)}又∵(w2,v2)=(2,3)∴q[3]=p[3]○+(w2,v2)={(2,3),(6,9)}∴m2j={(0,0),(2,3),(4,6), (6,9),(9,10),(10,11) } p[2]=m2j-其中的受控点={(0,0),(2,3),(4,6),(6,9),(9,10),(10,11)}又∵(w1,v1)=(2,6)∴q[2]=p[2]○+(w2,v2)={(2,6),(4,9),(6,12),(8,15)}∴m1j={(0,0),92,3},(2,6),(4,6),(4,9),(6,9),(6,12),(8,15),(9,10),(10,11)}∴p[1]={(0,0),(2,6),(4,9),(6,12),(8,15)}∴此0—1问题的最优值15.最优解为p[1]={(0,0),(2,6),(4,9)(6,12),(8,15)}3.设n=4,(a1,a2,a3,a4)=(3,4,8.10),(b1,b2,b3,b4)=(6,2,9,15),求作业中的一种最优调度方案并计算其最优值。

动态规划训练题目

动态规划训练题目

动态规划题目【引例1、上楼梯】一个含有n阶的楼梯,一次可以走1阶或2阶,从底走到顶一共有几种走法?n<=90。

【引例2、数字三角形】a1有一个数字三角形,编程求从最顶层到最底层的一条路所经过位置上数字之和的最大值。

每一步只能向左下或右下方向走。

下图数据的路应为7->3->8->7->5,和为30。

输入:文件输入(从键盘读入文件名),文件格式:第一行:R(1<=R<=10000),数字三角形共有R行;以下R行:依次表示数字三角形中每行中的数字。

每个数都是非负的,且<=100.输出:一个正整数,路径上数字之和的最大值。

输入样例:573 88 1 02 7 4 44 5 2 6 5输出样例:30【引例3、求最大连续子序列的和。

】a2输入:第一行:n(N<500)第二行:n个整数(-3000,3000)。

输出:最大连续子序列的和。

样例:输入:7-6 4 -1 3 2 -3 2输出:81、最长递增序列b1设有整数序列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)。

输入:m(<1000),整数序列输出:最大长度n样例:输入:7-6 4 -1 3 8 -3 2输出:42、背包问题b2设有n种物品,每种物品有一个重量及一个价值。

同时有一个背包,最大载重量为W,今从n种物品中选取若干件,使其重量的和小于等于W,而价值的和为最大。

输入数据:第一行两个数:物品总数N(<100),背包载重量W(<100);两个数用空格分隔;第二行N个数,为N种物品重量Wi;两个数用空格分隔;第三行N个数,为N种物品价值Vi; 两个数用空格分隔;输出数据:第一行总价值;输入样例:4 103 4 5 77 15 20 25输出样例:353、迷宫寻宝b3一个n行m列的迷宫(1<=n,m<=50),入口在左上角,规定只能向下或向右走。

动态规划练习题

动态规划练习题

最小乘车费用 (bus)【问题描述】而任意一辆汽车从不行驶超过1 0公里。

某人想乘车到达n公里远的地方,假设他可以任意次换车,请你帮他找到一种乘车方案,使得总费用最小。

注意:1 0公里的费用比1公里小的情况是允许的。

【输入文件】共两行:第一行为1 0个不超过200的整数,依次表示行驶1~1 0公里的费用,相邻两数间用一个空格隔开:第二行为某人想要乘车的公里数(不超过20000的整数)。

【输出文件】仅一行,包含一个整数,表示到达n公里所需要的最小费用。

【样例输入】12 21 31 40 49 58 69 79 90 10115【样例输出】147船 (ships)【问题描述】PALMIA国家被一条河流分成南北两岸,南北两岸上各有N个村庄。

北岸的每一个村庄有一个唯一的朋友在南岸,且他们的朋友村庄彼此不同。

每一对朋友村庄想要一条船来连接他们,他们向政府提出申请以获得批准。

由于河面上常常有雾,政府决定禁止船只航线相交(如果相交,则很可能导致碰船)。

你的任务是编写一个程序,帮助政府官员决定批准哪些船只航线,使得不相交的航线数目最大。

【输入文件】ships.in输入文件由几组数据组成。

每组数据的第一行有2个整数X,Y,中间有一个空格隔开,X代表PALMIA河的长度(10<=X<=6000),Y代表河的宽度(10<=Y<=100)。

第二行包含整数N,表示分别坐落在南北两岸上的村庄的数目(1<=N<=5000)。

在接下来的N行中,每一行有两个非负整数C,D,由一个空格隔开,分别表示这一对朋友村庄沿河岸与PALMIA 河最西边界的距离(C代表北岸的村庄,D代表南岸的村庄),不存在同岸又同位置的村庄。

最后一组数据的下面仅有一行,是两个0,也被一空格隔开。

【输出文件】ships.out对输入文件的每一组数据,输出文件应在连续的行中表示出最大可能满足上述条件的航线的数目。

【输入样例】30 4722 42 610 315 129 817 174 20 0【输出样例】4DOLLARS (dollars)【问题描述】在以后的若干天里戴维将学习美元与德国马克的汇率。

动态规划练习题(含答案)

动态规划练习题(含答案)

动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。

举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。

程序不能预存结果直接输出。

PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。

SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

动态规划试题

动态规划试题

1. 某公司打算向它的三个营业区增设6个销售店,每个营业区至少增设1个。

各营业区每年增加的利润与增设的销售店个数有关,具体关系如表1所示。

试规划各营业区应增设销售店的个数,以使公司总利润增加额最大。

表1解:将问题按区分为三个阶段3,2,1=k ,设状态变量k S (3,2,1=k )代表从第k 个区到第3个区的增设个数,决策变量k x 代表第k 个区的增设个数。

于是有状态转移率k k k x S S -=+1、允许决策集合}0|{)(k k k k k S x x S D ≤≤=和递推关系式:)}()({max )(10k k k k k S x k k x S f x g S f kk -+=+≤≤ )1,2,3(=k0)(44=S f当3=k 时:)}({max }0)({max )(330330333333x g x g S f S x S x ≤≤≤≤=+=于是有表7-2,表中*3x 表示第三个阶段的最优决策。

单位:百万元当2=k 时:)}()({max )(2232202222x S f x g S f S x -+=≤≤于是有表7-3。

表7-3 (单位:百万元)当1=k 时:)}()({max )(1121101111x S f x g S f S x -+=≤≤于是有表7-4。

故最优分配方案为:A 区建3个销售店,B 区建2个销售店,C 区建1个销售店, 总利润为490万元。

2. 某工厂有100台机器,拟分4个周期使用,在每一周期有两种生产任务,据经验把机器投入第一种生产任务,则在一个周期中将有六分之一的机器报废,投入第二种生产任务,则有十分之一的机器报废。

如果投入第一种生产任务每台机器可收益1万元,投入第二种生产任务每台机器可收益0.5万元。

问怎样分配机器在4个周期内的使用才能使总收益最大? 解:阶段:将每个周期作为一个阶段,即k=1,2,3,4 状态变量:第k 阶段的状态变量k S 代表第k 个周期初拥有的完好机器数决策变量:决策变量k x 为第k 周期分配与第一种任务的机器数量,于是k k x S -该周期分配在第二种任务的机器数量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

动态规划练习题USACO 2.2 Subset Sums题目如下:对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。

举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:and {1,2}这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} and {2,3,4,5} {注1+6+7=2+3+4+5}{2,5,7} and {1,3,4,6}{3,4,7} and {1,2,5,6}{1,2,4,7} and {3,5,6}给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。

程序不能预存结果直接输出。

PROGRAM NAME: subsetINPUT FORMAT输入文件只有一行,且只有一个整数NSAMPLE INPUT (file subset.in)7OUTPUT FORMAT输出划分方案总数,如果不存在则输出0。

SAMPLE OUTPUT (file subset.out)4参考程序如下:#include <fstream>using namespace std;const unsigned int MAX_SUM = 1024;int n;unsigned long long int dyn[MAX_SUM];ifstream fin ("subset.in");ofstream fout ("subset.out");int main() {fin >> n;fin.close();int s = n*(n+1);if (s % 4) {fout << 0 << endl;fout.close ();return ;}s /= 4;int i, j;dyn [0] = 1;for (i = 1; i <= n; i++)for (j = s; j >= i; j--)dyn[j] += dyn[j-i];fout << (dyn[s]/2) << endl;fout.close();return 0;}USACO 2.3 Longest Prefix题目如下:在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。

生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。

如果一个集合P 中的元素可以通过串联(允许重复;串联,相当于Pascal 中的“+” 运算符)组成一个序列S ,那么我们认为序列S 可以分解为P 中的元素。

并不是所有的元素都必须出现。

举个例子,序列ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列S 的前面K 个字符称作S 中长度为K 的前缀。

设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。

PROGRAM NAME: prefixINPUT FORMAT输入数据的开头包括1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串表示。

字母全部是大写,数据可能不止一行。

元素集合结束的标志是一个只包含一个“.” 的行。

集合中的元素没有重复。

接着是大写字母序列S ,长度为1..200,000 ,用一行或者多行的字符串来表示,每行不超过76 个字符。

换行符并不是序列S 的一部分。

SAMPLE INPUT (file prefix.in)A AB BA CA BBC.ABABACABAABCOUTPUT FORMAT只有一行,输出一个整数,表示S 能够分解成P 中元素的最长前缀的长度。

SAMPLE OUTPUT (file prefix.out)11示例程序如下:#include <stdio.h>#define MAXP 200#define MAXL 10char prim[MAXP+1][MAXL+1];int nump;int start[200001];char data[200000];int ndata;int main(int argc, char **argv){FILE *fout, *fin;int best;int lv, lv2, lv3;if ((fin = fopen("prim.in", "r")) == NULL){perror ("fopen fin");exit(1);}if ((fout = fopen("prim.out", "w")) == NULL){perror ("fopen fout");exit(1);}while (1){fscanf (fin, "%s", prim[nump]);if (prim[nump][0] != '.') nump++;else break;}ndata = 0;while (fscanf (fin, "%s", data+ndata) == 1)ndata += strlen(data+ndata);start[0] = 1;best = 0;for (lv = 0; lv < ndata; lv++)if (start[lv]){best = lv;for (lv2 = 0; lv2 < nump; lv2++){for (lv3 = 0; lv + lv3 < ndata && prim[lv2][lv3] && prim[lv2][lv3] == data[lv+lv3]; lv3++)if (!prim[lv2][lv3])start[lv + lv3] = 1;}}if (start[ndata]) best = ndata;fprintf (fout, "%i\n", best);return 0;}USACO 3.1 Score Inflation题目如下:我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。

你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。

输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000。

后面的每一行将包括两个整数来描述一个"种类":第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。

你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的"种类"的题目数目可能任何非负数(0或更多)。

计算可能得到的最大分数。

PROGRAM NAME: inflateINPUT FORMAT第 1 行: M, N--竞赛的时间和题目"种类"的数目。

第2-N+1 行: 两个整数:每个"种类"题目的分数和耗时。

SAMPLE INPUT (file inflate.in)300 4100 60250 120120 10035 20OUTPUT FORMAT单独的一行包括那个在给定的限制里可能得到的最大的分数。

SAMPLE OUTPUT (file inflate.out)605{从第2个"种类"中选两题,第4个"种类"中选三题}示例程序如下:#include <fstream.h>ifstream fin("inflate.in");ofstream fout("inflate.out");const short maxm = 10010;long best[maxm], m, n;voidmain(){short i, j, len, pts;fin >> m >> n;for (j = 0; j <= m; j++)best[j] = 0;for (i = 0; i < n; i++) {fin >> pts >> len;for (j = len; j <= m; j++)if (best[j-len] + pts > best[j])best[j] = best[j-len] + pts;}fout << best[m] << endl; // 由于数组元素不减,末元素最大}USACO 3.3 A Game题目如下:有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。

以最终得分多者为胜。

编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。

你的程序要始终为第二位玩家执行最优策略。

PROGRAM NAME: game1INPUT FORMAT第一行: 正整数N, 表示序列中正整数的个数。

第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

SAMPLE INPUT (file game1.in)64 7 2 95 2OUTPUT FORMAT只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。

SAMPLE OUTPUT (file game1.out)18 11参考程序如下:#include <stdio.h>#define NMAX 101int best[NMAX][2], t[NMAX];int n;voidreadx () {int i, aux;freopen ("game1.in", "r", stdin);scanf ("%d", &n);for (i = 1; i <= n; i++) {scanf ("%d", &aux);t = t[i - 1] + aux;}fclose (stdin);}inline intmin (int x, int y) {return x > y ? y : x;}voidsolve () {int i, l;for (l = 1; l <= n; l++)for (i = 1; i + l <= n + 1; i++)best[l%2] = t[i + l - 1] - t[i - 1] - min (best[i + 1][(l - 1) % 2],best[(l - 1) % 2]);}void writex () {freopen ("game1.out", "w", stdout);printf ("%d %d\n", best[1][n % 2], t[n] - best[1][n % 2]);fclose (stdout);}intmain () {readx ();solve ();writex ();return 0;}USACO 3.4 Raucous Rockers题目如下:你刚刚得到了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。

相关文档
最新文档