NOI导刊_坐标规则型动态规划
动态规划在信息学奥林匹克竞赛中的应用
动态规划在信息学奥林匹克竞赛中的应用一.动态规划含义:在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都要做出决策,从而使整个过程达到最好的活动效果.因此,各个阶段决策确定后,组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程,就称为多阶段决策过程,这种问题称为多阶段决策问题.在多阶段决策问题中,各个阶段采取的决策,一般来说是和时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有"动态"的含义,我们称这种解决多阶段决策最优化的过程为动态规划.二.动态规划特征动态规划的显著特征是:无后效性,有边界条件,且一般划分为很明显的阶段.动态规划一般还存在一条或多条状态转移方程.三.例题1. Catcher防卫导弹(GDOI'98)题目讲得很麻烦,归根结底就是求一整串数中的最长不上升序列这道题目一开始我使用回溯算法,大概可以拿到1/3的分吧,后来发现这其实是动态规划算法中最基础的题目,用一个二维数组C[1..Max,1..2]来建立动态规划状态转移方程(注:C[1..Max,1]表示当前状态最多可击落的导弹数,C[1..Max,2]表示当前状态的前继标志):Ci=Max{C[j]+1,(j=i+1..n)},然后程序也就不难实现了.示范程序:program catcher_hh;varf:text;i,j,k,max,n,num:integer;a:array [1..4000] of integer; {导弹高度数组}c:array [1..4000,1..2] of integer; {动态规划数组}procedure readfile;beginassign(f,'catcher.dat'); reset(f);readln(f,num);for i:=1 to num doreadln(f,a[i]);end;procedure work;beginfillchar(c,sizeof(c),0); c[num,1]:=1; {清空数组,赋初值}{开始进行动态规划}for i:=num-1 downto 1 dobeginn:=0; max:=1;for j:=i+1 to num doif (a[i]>a[j]) and (max<1+c[j,1])then begin n:=j; max:=1+c[j,1]; end;c[i,1]:=max; c[i,2]:=n;end;writeln; writeln('Max : ',max); {打印最大值}max:=0; n:=0;for i:=1 to num doif c[i,1]>max then begin max:=c[i,1]; n:=i; end;{返回寻找路径}repeatwriteln(n,' '); n:=c[n,2];until n=0;end;beginreadfile; work;end.2. Perform巡回演出(GDKOI'2000)题目描述: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 62 130 1503 75 0 807 120 110 0 100 110 120 04 60 70 60 503 0 135 1402 70 802 0 701 800 0样例输出:460初看这道题,很容易便可以想到动态规划,因为第x天在第y个地方的最优值只与第x-1天有关,符合动态规划的无后效性原则,即只与上一个状态相关联,而某一天x航班价格不难求出S=C[(x-1) mod m +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)},动态规划方程一出,尽可以放怀大笑了.示范程序:program perform_hh;varf,fout:text;p,l,i,j,n,k:integer;a:array [1..1000,1..10] of integer; {动态规划数组}c:array [1..10,1..10] of record {航班价格数组}num:integer;t:array [1..30] of integer;end;e:array [1..1000] of integer;procedure work;begin{人工赋第一天各城市最优值}for i:=1 to n dobeginif c[1,i].t[1]<>0then a[1,i]:=c[1,i].t[1];end;for i:=2 to k dobeginfor j:=1 to n dobeginfor l:=1 to n dobeginif (j<>l)and (c[l,j].t[(i-1) mod c[l,j].num+1]<>0) {判断存在航班}and ((a[i,j]=0) or (a[i-1,l]+c[l,j].t[(i-1) mod c[l,j].num+1]<a[i,j])) {判断比当前解优}then a[i,j]:=a[i-1,l]+c[l,j].t[(i-1) mod c[l,j].num+1]; {赋值}end;end;e[p]:=a[k,n]; {第p个场景的最优值}end;procedure readfile; {读文件}beginassign(f,'PERFORM.DA T'); reset(f);assign(fout,'PERFORM.OUT'); rewrite(fout);readln(f,n,k); p:=0;while (n<>0) and (k<>0) dobeginp:=p+1;fillchar(c,sizeof(c),0);fillchar(a,sizeof(a),0);for i:=1 to n dobeginfor j:=1 to i-1 dobeginread(f,c[i,j].num);for l:=1 to c[i,j].num doread(f,c[i,j].t[l]);end;for j:=i+1 to n dobeginread(f,c[i,j].num);for l:=1 to c[i,j].num doread(f,c[i,j].t[l]);end;end;work;readln(f,n,k);end;{输出各个场景的解}for i:=1 to p-1 dowriteln(fout,e[i]);write(fout,e[p]);close(f);close(fout);end;beginreadfile;end.四.小结动态规划与穷举法相比,大大减少了计算量,丰富了计算结果,不仅求出了当前状态到目标状态的最优值,而且同时求出了到中间状态的最优值,这对于很多实际问题来说是很有用的.这几年,动态规划已在各省市信息学奥林匹克竞赛中占据相当重要的地位,每年省赛8道题目中一般有2~3道题目属于动态规划,动态规划相比一般穷举也存在一定缺点:空间占据过多,但对于空间需求量不大的题目来说,动态规划无疑是最佳方法!五.课后题目1. m个人抄n本书,每本书页数已知,每个人(第一个人除外)都必须从上一个人抄的最后一本书的下一本抄起(书必须整本整本的抄),求一种分配方法,使抄书页数最多的人抄书页数尽可能少. (GDOI''99 Books).2. 有一字符串有多种编码方式可供人选择,将这个字符串进行编码,使求得得编码长度最短。
信息学奥赛动态规划
【例题3】最长不降子序列: 设有由n个不相同的整数组成的数列,记为: a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j) 例如3,18,7,14,10,12,23,41,16,24。 若存在i1<i2<i3< … < ie 且有a(i1)<a(i2)< … <a(ie)则称为长度为e的不下降序列。如 上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12, 16,24长度为6的不下降序列。程序要求,当原数列给出之后,求出最长的不下降序 列。 输入文件:第一行输入一个数n(n<100),表示有几个数,第二行有n个数,表示该 序列的数 输出文件:第一行输出一个数m,表示最长序列有多少个数,第二行输出这m个数
【例题2】背包问题:一个旅行者有一个最多能用m公斤的背包,现在有n件物品, 它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只 有一件求旅行者能获得最大总价值。 输入文件:第一行输入一个数n(n<100),接下来n行,每行两位数,第一个数为 该物品的重量,第二行为改物品的价值 输出文件:输出价值的最大数 同样的,在这个问题中,如果我们用穷举法去做这个问题就非常的复杂,而且非常 的耗费时间,那么在这个问题中我们可以用一个一维数组f[j]去表示用空间j可以装 下的最大的物品的最大价值。这时候怎么去动态呢? 个一个列举,当有一 个物品的时候,f[j]怎么变化,然后有两个物品的时候怎么变化,直到全部列举完, 这个过程就是一个动态的过程,即随着物品的不断增加,f[j]不断的变化 F[j]:=max(f[j],f[j-a[i]]+b[i]) 上一题是这f[i,j]这个阶段取决与f[i-1,j]这个阶段,同样的在这个题目中,当有n个物 品的时候,你要怎么取舍,要取决与你前面保存的n-1个物品的状态 和这个问题类似的问题还有采药,开心的金明,几乎是一样的。
NOIP普及讲座4-动态规划2
经典例题讲解
【输入格式】 第一行为硬币总值total和硬币种类数n。 以下n行为数值a[i],i=1,2,3...n 【输出格式】 一行,解决方案数 【样例输入】 83 5 50 25 10 5 1 【样例输出】 159
经典例题讲解
【样例说明】 0 x 50
0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50 0 x 50
经典例题讲解
下面是一个例子 1 2 3 45 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点不滑向上下左右相邻四个点之一,当且仅当高度减 小,在上面的例子中,一条可行的不滑坡为24-17-16-1(从24开始, 在1结束)。当然25-24-23-…-3-2-1更长。事实上,这是最长 的一条。 【输入格式】 第1行为表示区域的二维数组的行数R和列数C(1≤R,C≥100)。下面是
n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入 第一行是一个整数V,表示箱子容量。 第二行是一个整数n,表示物品数。 接下来n行,每行一个正整数(不超过10000),分别表示这n个物品的各自
体积。 输出 一个整数,表示箱子剩余空间。
经典例题讲解
0 x 10
0 x 5 83 x 1 1 x 5 78 x 1 2 x 5 73 x 1 3 x 5 68 x 1 4 x 5 63 x 1 5 x 5 58 x 1 6 x 5 53 x 1 7 x 5 48 x 1 8 x 5 43 x 1 9 x 5 38 x 1 10 x 5 33 x 1 11 x 5 28 x 1 12 x 5 23 x 1 13 x 5 18 x 1
NOI导刊资源背包动态规划
少。
剩下钱数最少的找零方案中的所需的最少 硬币数。
N<=500,T<=10000.
分析
设F[i]表示需要找的钱数为i时所需要的最少 钱币数。显然有:
F[i]=Min{F[ i - A[j] ] + 1} { i≤ T,1≤j≤N} 初始值:F[0]=0。 A[j]表示其中 第j种钱币的面值。 时间复杂度为O(N*T)。
动态规划
• 可以按每个物品进行规划,同样每种物品有选和 不选两种选择
• 设F(i,j)表示前i件物品载重为j的最大效益,则有
F(i 1, j w[i]) C[i],第i种物品装载 F(i, j) MaxF(i 1, j),第i种物品不装载
• 1<=i<=N, 0<=j<=N • 初值:F(0,j)=0 • F(N,M)即答案 • 显然时间复杂度为O(NM)
for j:=0 to m do
begin
if j>=w[i] then //背包容量够大
f[j]:=max(f[j-w[i]]+c[i],f[j])
end;
思考题1:机器分配
• M台设备,分给N个公司。 • 若公司i获得j台设备,则能产生Aij效益 • 问如何分配设备使得总效益最大? • M<=15,N<=10。
else
//背包容量不足
f[i,j]:=f[i-1,j];
end;
满背包问题(01背包)
• 有N件物品; • 第i件物品Wi公斤; • 第i件物品价值Ci元; • 现有一辆载重M公斤的卡车; • 问选取装载哪些物品,使得卡车开车正
好装满时,运送的总价值最大? 若无法装满卡车,则输出无解。
noip动态规划
【算法分析】 把A到E的全过程分成四个阶段,用K表示阶段变量,第1阶段有一个初始状态A,有两条可供选择的支路A-B1、A-B2;第2阶段有两个初始状态B1、B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用DK(XI,X+1J)表示在第K阶段由初始状态XI到下阶段的初始状态X+1J的路径距离,FK(XI)表示从第K阶段的XI到终点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{ 5+3,6+4 } = 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 S3: K = 2 有 F2(B1)= MIN{ D2(B1,C1)+ F3(C1),D2(B1,C2)+ F3(C2), D2(B1,C3)+ F3(C3)} = MIN{ 1+8,6+8,3+11} = 9 F2(B2)= MIN{ D2(B2,C2)+ F3(C2),D2(B2,C4)+ F3(C4)} = MIN{ 8+8,4+6 } = 10 S4: K = 1 有 F1(A)= MIN{ D1(A,B1)+ F2(B1),D1(A,B2)+ F2(B2)} = MIN{ 5+9,3+10} = 13 因此由A点到E点的全过程最短路径为A→B2→C4→D3→E;最短路程长度为13。 从以上过程可以看出,每个阶段中,都求出本阶段的各个初始状态到终点E的最短距离,当逆序倒推到过程起点A时,便得到了全过程的最短路径和最短距离。 在上例的多阶段决策问题中,各个阶段采取的决策,一般来说是与阶段有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义,我们称这种解决多阶段决策最优化的过程为动态规划程序设计方法。
NOIP复赛复习8动态规划巩固与提高
考虑时空效率,DFS 确实很暴力啊,有没有什么优化呢?? 我们引入“冗余搜索”这个概念:无用的,不会改变答案的搜索 例子:观察下面两个例子。用两种方式都能到达第 3 行第 2 列,只是路径不同,同时走到这 个点两条路权值和不一样,其中一个总和为 8,一个总和 12。 那么可以观察可得,总和为 8 的搜索是冗余的(不会改变答案),即使不继续搜索,答案也不 会改变。 因为 12 往下搜索,无论往左往右,都会比 8 对应的路径大。 可见,冗余就是剪枝的“枝”,那么如何利用冗余搜索,来优化程序呢?
接下来我们进入重点,还是回到刚才的采药问题,我们回忆刚才这题的记忆化搜索。 状态设计:记录 F[i][j] 为,已经决定前 i 件物品的情况,在总重量为 j 的情况下,物品总价 值的最大值。同样也是有两种方法可以推导: @顺推: “我这个状态的下一步去哪里” @逆推: “从什么状态可以到达我这里” 当前状态: F[i][j] 为,已经决定前 i 件物品的情况,在总重量为 j 的情况下,物品总价值的 最大值。 @顺推: “我这个状态的下一步去哪里” :我现在要决定下一件物品取还是不取。
NOIP 复赛复习 8 动态规划巩固与提高
经典例题:数字金字塔(Luogu 1216) 写一个程序来查找从最高点到底部任意处结束的路径, 使路径经过数字的和最大。 每一步可 以走到左下方的点也可以到达右下方的点。
我们现在这里讨论搜索如何实现: 状态:目前在第 x 行第 y 列 行动:向左走,向右走 例如:一个底边为 4 的三角形共有八种状态: 我们按照一般的搜索思路,进行深度优先搜索:
//T2:数字金字塔-顺推(有点类似于记忆化搜索的思路) f[0][0]=a[0][0]; for(int i=0;i<n-1;++i) for(int j=0;j<=i;++j)//f 数组为最优值路径(黑色金字塔,a 为源数据数组(紫色金字塔) { //分别用最优值来更新左下方和右下方 f[i+1][j]=max(f[i+1][j],f[i][j]+a[i+1][j]);//和当前的 f[i+1][j]比较 f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+a[i+1][j+1]);//和当前的 f[i+1][j+1]比较 } //T4:数字金字塔-逆推(自顶向下) f[0][0]=a[0][0]; for(int i=0;i<n;++i)//单独处理 { f[i][0]=f[i-1][0]+a[i][0];//最左的位置没有左上方 f[i][i]=f[i-1][i-1]+a[i][i];//最右的位置没有右上方 for(intj=1;j<i;++j)//在左上方和右上方取较大的 f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; } //答案可能是最后一行的任意一列 ans=0; for(int i=0;i<n;++i) ans=max(ans,f[n-1][i]);
坐标规则型动态规划
坐标规则型动态规划1.机器人有一个机器人,每次可以向右或向下走,有些垃圾等待它清扫2.矩阵取数游戏对于一个给定的n*m的矩阵,矩阵中的每个元素Aij为非负整数。
游戏规则如下:1. 每次取数时须从每行各取走一个元素,共n个。
m次后取完矩阵所有的元素;2. 每次取走的各个元素只能是该元素所在行的行首或行尾;3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分= 被取走的元素值*2i,其中i表示第i次取数(从1开始编号);4. 游戏结束总得分为m次取数得分之和。
求出取数后的最大得分。
N行求值可以独立进行F[I,j]:=max{f[i+1,j]+w*a[i],f[I,j-1]+w*a[j]}W:=w*2;最终求出max{f[I,j]+w*a[i]},i=1..m传纸条 双向动归F 表示纸条1到i1,j1位置,纸条2到i2,j2位置时的最优值。
优化:F 表示1到了i ,k-i 位置,2到了j ,k-j 位置时的最优值,k 表示步数。
免费馅饼• SERKOI 最新推出了一种叫做“免费馅饼”的游戏。
• 游戏在一个舞台上进行。
舞台的宽度为W 格,天幕的高度为H 格,游戏者占一格。
开始时,游戏者站在舞台的正中央,手里拿着一个托盘。
• 游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。
游戏者左右移动去接馅饼。
游戏者每秒可以向左或右移动一格或两格,也可以站在愿地不动。
],[],[)1,,1,()1,,,1(),1,1,(),1,,1(max ),,,(221122112211221122112211j i C j i C j i j i f j i j i f j i j i f j i j i f j i j i f ++⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧--------=],[],[)1,1,1()1,,1(),1,1(),,1(max ),,(22112121212121i k i C i k i C i i k f i i k f i i k f i i k f i i k f -+-+⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧--------=• 馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。
NOIP的DP总结之DP类型
procedure MultiplePack(cost,weight,amount)
if cost*amount>=V
CompletePack(cost,weight)
return
integer k=1
while k<amount
ZeroOnePack(k*cost,k*weight)
amount=amount-k
f[j*v+k]:=b[l]+j*w; //用队列头的值更新f[j*v+k]
end;
end;
end;
writeln(f[m]);
end.
题目:砝码秤重,tyvj1086,zoj2156,poj2392,hdu1085
Poj1014,divide(见dp2)
二维费用背包
就是限制条件多了一个,变成了二维容量,从而状态多了一维而已。
题目:hdu3236,打包(见dpset)poj2184
分组背包
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]
for i:=1 to n do
begin
read(v,w,c); //读入当前物品:v为物品体积、w为物品价值、c为物品可用次数
if m div v<c k:=0 to v-1 do //把所有的体积按除以v的余数划分为0~v-1
信息学奥赛中的动态规划
完全背包问题
每个物品可以拿无限次,只要不超过最大重量即可
思路1:背包+枚举
在状态转移时枚举每个物品可以拿的次数,时间复杂度 O(VNK)
优化1:减少物品种类
对于一个物品来说,假如它的重量大于等于另一个物品且它 的价值比另一个物品低,那么要它何用?可以直接省略掉该 物品,所以只要先预对所有物品进行一遍O(n^2)的预处理, 就能带来很大的优化
金明的预算方案(NOIP2006提高组)
题目描述 Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里 有一间金明自己专用的很宽敞的房间。更让他高兴的是, 妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布 置,你说了算,只要不超过N元钱就行”。今天一早,金明 就开始做预算了,他把想买的物品分为两类:主件与附件 ,附件是从属于某个主件的,右图就是一些主件与附件的 例子。 如果要买归类为附件的物品,必须先买该附件所属的主件 。每个主件可以有0个、1个或2个附件。附件不再有从属 于自己的附件。金明想买的东西很多,肯定会超过妈妈限 定的N元。于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5表示,第5等最重要。他还从因特网上查到 了每件物品的价格(都是10元的整数倍)。他希望在不超 过N元(可以等于N元)的前提下,使每件物品的价格与重 要度的乘积的总和最大。 设第j件物品的价格为v[j],重要度为w[j],共选中了k 件物品,编号依次为j1,j2,……,jk,则所求的总和为: v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其 中*为乘号) 请你帮助金明设计一个满足要求的购物单。
清北学堂2012国庆NOIP课件——动态规划
鹰蛋实验
数组f[i,j]表示用i个鹰蛋需要试验j层,在最坏情况下最 小值
若在k层实验,如何确定最坏情况?
如果碎了。则用剩下i-1个鹰蛋实验k-1层,即f[i-1,k-1] 如果没碎。则用这i个鹰蛋实验j-k层,即f[i,j-k]
f [ i , j ] min {max{ f [ i 1, k 1] 1, f [ i , j k ] 1}}
动态规划
贾志豪
清北学堂十一NOIP培训班
动态规划的分类
线性动态规划
树型动态规划
状态压缩动态规划
与图论结合
线性动态规划
一维、二维、多维
Transmission Delay
给定一个长度为n的01串,作为机器的输入 (n <= 2000)
机器的输出保证:
是一个长度为n的01串 0的个数于输入相同 每一个0、1有可能被delay
第i位输入有可能是输出的第j位,满足|i-j|<=D
编写程序
计算共有多少个可能的输出 计算可能的输出中,字典序第k个是多少
USACO 2009 Holiday delay
Transmission Delay
D[i][j]表示如果输出串前i位已经确定了,并且有j个0的 情况下,有多少种可能的输出串
/codejam/contest/dashboard?c=635101#s=p1
noip动态规划讲解课件
用f[x,i,j]表示走到第x步时,第1条路线走到横坐标为i的地方,第2条路线走到了横坐标为j的地方。这样,我们只要枚举x,i,j,就能递推出来了。
For x:=3 To m+n Do For i:=1 To Min(x,n) Do For j:=1 To Min(x,n) Do Begin f[x,i,j]:=Max(f[x-1,i,j],f[x-1,i-1,j],f[x-1,i,j-1],f[x-1,i-1,j-1]); If i=j Then Inc(f[x,i,j],a[i,x-i]) Else Begin Inc(f[x,i,j],a[x-i,i]); Inc(f[x,i,j],a[x-j,j]); End; End;
动态规划实质:
枚举
+
递推
状态
状态转移方程
Sample Problem1
1
3
5
9
1
从树的根到树的叶节点,最多能取多少数?
贪心:答案错误
暴力搜索:如果数据大会超时
我们先将NOIp里的动态规划分分类:
最长不降子序列 背包 方格取数 石子归并 状态压缩 数学递推 顺序递推
合唱队形(NOIp2004) 【问题描述】 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。 【输入文件】 输入文件第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高。 【输出文件】 输出文件包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
4种常见的动态规划模型
例谈四种常见的动态规划模型动态规划是解决多阶段决策最优化问题的一种思想方法,本文主要结合一些例题,把一些常见的动态规划模型,进行归纳总结。
(一)、背包模型可用动态规划解决的背包问题,主要有01背包和完全背包。
对于背包的类型,这边就做个简单的描述:n个物品要放到一个背包里,背包有个总容量m,每个物品都有一个体积w[i]和价值v[i],问如何装这些物品,使得背包里放的物品价值最大。
这类型的题目,状态表示为:f[j]表示背包容量不超过j时能够装的最大价值,则状态转移方程为:f[j]:=max{f[j-w[i]]+v[i]},边界:f[0]:=0;简单的程序框架为:beginreadln(m,n);for i:=1 to n do readln(w[i],v[i]);f[0]:=0;for i:=1 to m dofor j:=1 to n dobeginif i>=w[j] then t:=f[i-w[j]]+v[j];if t>f[i] then f[i]:=t;end;writeln(f[m]);end.这类型的题目应用挺广的(noip1996提高组第4题,noip2001普及组装箱问题,noip2005普及组采药等),下面一个例子,也是背包模型的简单转化。
货币系统(money)【问题描述】母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。
他们对货币的数值感到好奇。
传统地,一个货币系统是由1,5,10,20或25,50,100的单位面值组成的。
母牛想知道用货币系统中的货币来构造一个确定的面值,有多少种不同的方法。
使用一个货币系统{1,2,5,10,..}产生18单位面值的一些可能的方法是:18×1,9×2,8×2+2×1,3×5+2+1等等其它。
写一个程序来计算有多少种方法用给定的货币系统来构造一个确定的面值。
【输入格式】货币系统中货币的种类数目是v(1≤v≤25);要构造的面值是n(1≤n≤10,000);第1行:二个整数,v和n;第2..v+1行:可用的货币v个整数(每行一个)。
信息竞赛复习资料5--动态规划(NOIP)
信息竞赛复习资料5--动态规划(NOIP)编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(信息竞赛复习资料5--动态规划(NOIP))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为信息竞赛复习资料5--动态规划(NOIP)的全部内容。
第一章什么叫动态规划1。
1 多阶段决策过程的最优化问题1、问题的提出首先,例举一个典型的且很直观的多阶段决策问题:[例]下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A-〉E。
求A—〉E的最省费用。
如图从A到E共分为4个阶段,即第一阶段从A到B,第二阶段从B到C,第三阶段从C到D,第四阶段从D到E。
除起点A和终点E外,其它各点既是上一阶段的终点又是下一阶段的起点.例如从A到B的第一阶段中,A为起点,终点有B1,B2,B3三个,因而这时走的路线有三个选择,一是走到B1,一是走到B2,一是走到B3。
若选择B2的决策,B2就是第一阶段在我们决策之下的结果,它既是第一阶段路线的终点,又是第二阶段路线的始点。
在第二阶段,再从B2点出发,对于B2点就有一个可供选择的终点集合(C1,C2,C3);若选择由B2走至C2为第二阶段的决策,则C2就是第二阶段的终点,同时又是第三阶段的始点。
同理递推下去,可看到各个阶段的决策不同,线路就不同。
很明显,当某阶段的起点给定时,它直接影响着后面各阶段的行进路线和整个路线的长短,而后面各阶段的路线的发展不受这点以前各阶段的影响。
故此问题的要求是:在各个阶段选取一个恰当的决策,使由这些决策组成的一个决策序列所决定的一条路线,其总路程最短。
具体情况如下:(1)由目标状态E向前推,可以分成四个阶段,即四个子问题.如上图所示.(2)策略:每个阶段到E的最省费用为本阶段的决策路径。
坐标规则型动态规划26页PPT文档
矩阵取数游戏 (NOIP2019)
对于一个给定的n*m的矩阵,矩阵中的每个元素 aij为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。 m次 后取完矩阵所有的元素;
2. 每次取走的各个元素只能是该元素所在行的行首或行 尾;
3. 每次取数都有一个得分值,为每行取数的得分之和; 每行取数的得分 = 被取走的元素值*2i,其中i表示第i次 取数(从1开始编号);
6+20+56=82
数据范围
60%的数据满足:1<=n, m<=30,答案不 超过1016
100%的数据满足:1<=n, m<=80, 0<=aij<=1000
分析
首先,n行求值可以独立考虑! 设f[i,j]表示区间i-j的最优值 f[i,j]=max{f[i+1,j]+w*a[i] , f[i,j-
样例分析
最多能拾5块。有4种方法。
分析(1)
因为机器人只能向右或者向下走。符合无后效性 原则。于是考虑动态规划。
设F(i,j)表示从(1,1)点开始走到(i,j)的时候,最 多捡了多少垃圾。
F(i,j)=Max{f(i-1,j),f(i,j-1)}+c[i,j] 其中C[i,j]=1表示(i,j)点有垃圾。C[i,j]=0表示
1<=m,n<=50
分析
贪心算法错误,因此我们需要同时考虑两个纸条的传递。 由于小渊和小轩的路径可逆,因此,尽管出发点不同,但
都可以看成同时从(1,1)出发到达(M,N)点。 设f(i1,j1,i2,j2)表示纸条1到达(i1,j1)位置,纸条2到达
(i2,j2)位置的最优值。则有,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 其中 (i1,j1)<> (i2,j2) • 1<=i1, i2<=M, 1<=j1 , j2<=N • 时间复杂度O(N2M2)
分析2
• 另一种思路:每个纸条都需要走M+N步才能达到目标。 • 因此,设F(k,i1,i2)表示两个纸条都走了K步,第1个纸条横 坐标为i1,第2个纸条横坐标为i2的最优值。 • 则两个纸条的纵坐标分别为j1=K-i1, j2=K-i2 ,状态转移方程 如下:
• 其中 i1<>i2 • 1<=i1, i2<=M,1<=k<=N+M • 时间复杂度O((N+M)*M2)
免费馅饼
• SERKOI最新推出了一种叫做“免费馅饼”的游戏。 • 游戏在一个舞台上进行。舞台的宽度为W格,天幕的高度 为H格,游戏者占一格。开始时,游戏者站在舞台的正中 央,手里拿着一个托盘。 • 游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并 垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以 向左或右移动一格或两格,也可以站在愿地不动。 • 馅饼有很多种,游戏者事先根据自己的口味,对各种馅 饼依次打了分。同时在8-308电脑的遥控下,各种馅饼下 落的速度也是不一样的,下落速度以格/秒为单位。当馅 饼在某一秒末恰好到达游戏者所在的格子中,游戏者就 收集到了这块馅饼。 • 写一个程序,帮助我们的游戏者收集馅饼,使得收集的 馅饼的分数之和最大。
• 输入数据: 第一行:宽度W(1~99奇数)和高度H(1 ~ 100整数) 接下来给出了一块馅饼信息。由4个正整数组成,分别表 示了馅饼的 初始下落时刻、水平位置、下落速度、分值。 游戏开始时刻为0。从1开始自左向右依次对水平方向的每 格编号。 • 输出数据: 收集到的馅饼最大分数之和。
• • • • •
样例分析
• 最多能拾5块。有4种方法。
分析(1)
• 因为机器人只能向右或者向下走。符合无 后效性原则。于是考虑动态规划。 • 设F(i,j)表示从(1,1)点开始走到(i,j)的时候, 最多捡了多少垃圾。 • F(i,j)=Max{f(i-1,j),f(i,j-1)}+c[i,j] • 其中C[i,j]=1表示(i,j)点有垃圾。C[i,j]=0表示 没有 • 1<=i<=n,1<=j<=m,决策2种 • 时间复杂度为O(n*m)
f (i1 1, j1 , i2 1, j2 ) f (i , j 1, i 1, j ) 1 1 2 2 f (i1 , j1 , i2 , j2 ) max C[i1 , j1 ] C[i2 , j2 ] f (i1 1, j1 , i2 , j2 1) f (i1 , j1 1, i2 , j2 1)
• 0<=i<=T,1<=j<=W,决策数为5个 • 时间复杂度为O(5WT)
三角蛋糕
• 一块边长为n的正三角形的大蛋糕,一些被老鼠 咬坏了,如下图黑色部分。
• 现想把该蛋糕切出一块最大的没被老鼠咬坏正三 角形的蛋糕; • 求切出的最大的三角形面积 • n≤100。
向上的三角形,
• 设顶点坐标为(i,j)的三角形最大高度为F(i,j)
反对文档高定价!
坐标规则型动态规划
长沙市雅礼中学 朱全民
Robots
• 在一个n*m的棋盘内,一些格子里有垃圾要 拾捡。现在有一个能捡垃圾的机器人从左 上格子里出发,每次只能向右或者向下走。 每次他到达一个点,就会自动把这个点内 的垃圾拾掉。 • 问:最多能拾多少垃圾。在最多的情况下, 有多少种拾垃圾方案? • 数据范围:n<=100,m<=100
贪心
• 很容易想到一个算法:
– – – – 求出1个纸条从(1,1)到(M,N)的路线最大值. 删除路径上的点值 再求出1个纸条从(M,N) 到(1,1)的路线最大值. 统计两次和
• 上述算法很容易找出反例,如下图。
• 第1次找最优值传递后,导致第2次无法传递。
分析
• 贪心算法错误,因此我们需要同时考虑两个纸条的传递。 • 由于小渊和小轩的路径可逆,因此,尽管出发点不同,但 都可以看成同时从(1,1)出发到达(M,N)点。 • 设f(i1,j1,i2,j2)表示纸条1到达(i1,j1)位置,纸条2到达(i2,j2)位 置的最优值。则有,
传纸条(NOIP2008)
• 小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下 角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者 向右传递,从小轩传给小渊的纸条只可以向上或者向左传 递。 • 班里每个同学都可以帮他们传递,但只会帮他们一次。 • 每个同学愿意帮忙的好感度有高有低,可以用一个0-100 的自然数来表示,数越大表示越好心。 • 小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条 ,即找到来回两条传递路径,使得这两条路径上同学的好 心程度只和最大。现在,请你帮助小渊和小轩找到这样的 两条路径。 • 1<=m,n<=50
• 求出取数后的最大得分。
样例
• 输入 23 123 342 • 输出 82 • 第1次:第一行取行首元素,第二行取行尾元素, 本次的氛围1*21+2*21=6 • 第2次:两行均取行首元素,本次得分为 2*22+3*22=20 • 第3次:得分为3*23+4*23=56。总得分为 6+20+56=82
分析
• • • • • • 首先,n行求值可以独立考虑! 设f[i,j]表示区间i-j的最优值 f[i,j]=max{f[i+1,j]+w*a[i] , f[i,j-1]+w*a[j]} 其中w=w+w,即w*2 需要做若干次高精度加法和乘法。 直到求出,max{f[i,i]+w*a[i],i=1..m}为止。
矩阵取数游戏 (NOIP2007)
• 对于一个给定的n*m的矩阵,矩阵中的每个元素 aij为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。 m次后 取完矩阵所有的元素; 2. 每次取走的各个元素只能是该元素所在行的行首或行 尾; 3. 每次取数都有一个得分值,为每行取数的得分之和; 每行取数的得分 = 被取走的元素值*2i,其中i表示第i次 取数(从1开始编号); 4. 游戏结束总得分为m次取数得分之和。
• 显然: F(i,j)=MIN{F(i-1,j-1),F(i-1,j+1)} +1, • 当C[i-1,j]=‘-’,表示这个三角形没被老鼠咬坏。
向下的三角形
• 设顶点坐标为(i,j)的三角形最大高度为G(i,j)
• 显然: G(i,j)=MIN{G(i+1,j-1),G(i+1,j+1)} +1, • 当C[i+1,j]=‘-’,表示这个三角形没被老鼠咬坏。
数据范围
• 60%的数据满足:1<=n, m<=30,答案不超 过1016 • 100%的数据满足:1<=n, m<=80, 0<=aij<=1000
• 1*21+2*21=6 • 2*22+3*22=20 • 3*23+4*23=56 1*21+2*22+3*23= • 2*21+3*22+别求F(i,j)和G(i,j) 1<=i<=n,1<=j<=2n-1 因此,时间复杂度O(N2) 答案为高度的平方,证明如下: 假设最大高度为W 则三角形个数为1+3+5+…+2W-1=W2
主程序
for i:=1 to n do{倒三角情况} for j:=i to 2*n-i do if (c[i,j]='-')and(i mod 2=j mod 2) then{如果该位置没被吃,而且必须是头 朝下的三角} begin if c[i-1,j]<>'-' then f[i,j]:=1 else f[i,j]:=min(f[i-1,j-1],f[i-1,j+1])+1;{是否可以从上面的位置转移过来堆成 更大的三角形} if f[i,j]>ans then ans:=f[i,j]; end; {正三角情况程序与上类似}
由上图可知,尽管下落了4个馅饼,但只能接到3个: 第1时刻可以接到分值为5的馅饼 第2时刻可以接到分值为3的馅饼 第3时刻可以接到分值为4的馅饼 因此馅饼的总分值为5+3+4=12
分析
• 由于馅饼下落的时间和速度都不同,人只能向左右移动, 馅饼只能向下移动。人和馅饼都同时移动,思考起来比较 复杂,因此我们需要转变思路: • • 算出每个时刻落到最底 层的每个格子有多少分 值的馅饼。 如果将馅饼当成参照物, 则馅饼向下落,可以看 成馅饼不动,人往上走 去摘取馅饼,这样人每 1时刻都可以走到上一 行的5个格子,如右图:
分析(2)
• 设G[i,j]表示在f[i,j]最大的时候,有多少种方 案。 • 捡到f(i,j)的垃圾只能从两个方向来走,方案 数累加即可。因此, g(i,j)=g[i-1,j]*k+g[i,j-1]*L 如果f[i-1,j]+c[i,j]=f[i,j],则K=1否则K=0。 如果f[i,j-1]+c[i,j]=f[i,j],则L=1否则L=0 • 时间复杂度O(n*m)
总结
• 规则类动态规划有一个共性,那就是在一个矩阵中(一般 是二维矩阵,当然可能有更加复杂的图形)给出一些规则 ,然后按规则去做某些决策,我们思考这类问题的基本方 法是:以坐标为状态,坐标之间的转换关系,一般利用问 题给出的规则进行决策转移。如下图。
• 状态转移方程一般可描述如下: F(i,j)=Max{f(i-1,k)}+决策;这里k为规则数
动态规划