中华中学动态规划讲义
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不是卒走一步马走一步。
【样例】
knight.in
knight.out
6633
6
分析:本题可用搜索算法,但Βιβλιοθήκη Baidu,M=15就会超时 。 再分析题意会发现:要到达棋盘上的一个点,只能 从左边过来或是从上面过来。根据加法原理,到达 某一点的路径数目,就等于到达其相邻的上点和左 点的路径数目之和,因此我们可以使用逐列(或逐 行)递推的方法来求出从起点到终点的路径数目。 障碍点(马的控制点)也完全适用,只要将到达该 点的路径数目设置为0即可。
中华中学动态规划讲义
介绍
动态规划是NOIP中非常重要的一类题型。 在动态规划中,算法是最难想到的,当你 想到了算法,实现也就迎刃而解。今天, 我们将强调算法的研究,不作上机实践
递推
递推是动态规划的根本,我们首先花一点时 间进行递推训练
递推关系是一种简洁高效的常见数学模型, 比如我们熟悉的Fibonacci数列问题。在这种类 型的问题中,每个数据项都和它前面的若干个 数据项(或后面的若干个数据项)有一定的关 联,这种关联一般是通过一个“递推关系式” 来表示的。求解问题时我们从初始的一个或若 干个数据项出发,通过递推关系逐步推进,从 而得到最终结果,这种求解问题的方法叫“递 推法”。其中,初始的若干数据项称为“边 界”。
{g[x,y]=1} {i>0,g[x,y]=0} {j>0,g[x,y]=0} {i>0,j>0,g[x,y]
递推边界为f[0,0]=1,考虑到最大情况下: n=20,m=20,路径条数可能会超出长整数范围所以要 使用Comp类型或高精度运算。
s:= ② readln(x); end; If (1 in s) then f1:=0 else fl:=1; If (2 in s) then f2:=0 else f2:= ③ If (3 in s) then f3:=0 else f3:=1+f1+f2;
if n=1 then f4:=f1 else if n=2 then f4:=f2
卒行走的规则:可以向下、或者向右。同时在棋盘
上C点有一个对方的马,该马所在的点和所有跳跃 一步可达的点称为对方马的控制点。因此称之为“马
拦过河卒”。棋盘用坐标表示,A点(0, 0)、B点(n,
m)(n, m为不超过15的整数),同样马的位置坐标是 需要给出的。现在要求你计算出卒从A点能够到达B 点的路径的条数,假设马的位置是固定不动的,并
“蜜蜂只能爬向右侧相邻的蜂房,不能反向 爬
行”的限制,决定了蜜蜂到b点的路径只能是 从b-1点或b-2点到达的,故fn=fn-1+fn-2 (a+2<=n<=b),边界条件fa=1,fa+1=1。
例2、打印杨晖三角形的前10行。杨晖三角形 的前5行如左下图所示。
问题分析:我们观察左上图不太容易找 到规律,但如果将左上图转化为右上图就不难 发现杨辉三角形其实就是一个二维表(数组) 的下三角部分。
else if n=3 then f4:=f3 else begin for i:=4 to n do begin if(i in s)then f4:=0 else f4:= ④ fl:=f2;f2:=f3;f3:=f4; end; end;
writeln(f4);readln;
end.
例4、棋盘上A点有一个过河卒,需要走到目标B点。
桃 Writeln(S); 子数}
End.
程序填空:设有一个n级的楼梯(1<=n<=12),编号 从下到上依次为1至n,其中有若干级为坏的。有 一个人上楼梯时一步可走1级、或2级、或3级( 坏级只能跨过不能踏上,但级数照算)。问:这个 人从楼下走到第n级,共有多少种不同的走法?
例如: 当n=l时(无坏级情况下),仅有1种走法 n=2时(无坏级情况下),有:1级+l级 或 2级 共2种
解决递推问题有三个重点:
一、如何建立正确的递推关系 二、递推关系有何性质 三、递推关系式如何求解
递推按照我们推导问题的方向,常分为顺推法和 倒推法。
例1、有一只经过训练的蜜蜂只能爬向右侧相邻的 蜂房,不能反向爬行。试求出蜜蜂从蜂房a爬到蜂 房b的可能路线数。
问题分析:这是一道很典型的Fibonacci 数列类题目,其中的递推关系很明显。由于
问题分析: 已知条件第 10 天剩下 1 个桃子,隐含
条件每一次前一天的桃子个数等于后一天桃子的 个数加 1 的 2 倍。
我们采取逆向思维的方法,从后往前推, 可用倒推法求解。
Var S,I:LongInt;
Begin S:=1;{第10天只有一个桃子} For I:=9 DownTo 1 Do S:=(S+1)*2;{第10天依次求前一天的
假设用f[i,j]表示到达点(i,j)的路径数目,用 g[i,j]表示点(i,j)是否是对方马的控制点,g[i,j]=0表示 不是对方马的控制点,g[i,j]=1表示是对方马的控制 点。则,我们可以得到如下的递推关系式:
f[i,j]=0 f[i,0]=f[i-1,0] f[0,j]=f[0,j-1] f[i,j]=f[i-1,j]+f[I,j-1]
假设用二维数组yh存储,每行首尾元素都为1,且 其中任意一个非首尾元素yh[i,j]的值其实就是 yh[i-1,j-1]与yh[i-1,j]的和,另外每一行的 元素个数刚好等于行数。有了这些规律,给数 组元素赋值就不难了,而要打印杨晖三角形, 只需控制一下每行输出的起始位置即可。
例3、猴子第1天摘下若干个桃子,当即吃了一半 又一个。第2天又把剩下的桃吃了一半又一个,以 后每天都吃前一天剩下的桃子的一半又一个,到 第10天猴子想吃时,只剩下一个桃子。 问猴子第 1天一共摘了多少桃子?
走法 n=3时(第二级为坏级情况下),有:1级+2级,直接3
级, 共2种走法 【程序说明】用递推方法求解。用集合记录坏级
。
var x,i,n,fl,f2,f3,f4:longint;s:set of 0..30; begin
readln(n);s:= ① readln(x);{x:坏级,以0结束} while (x<>O)do begin