浙江大学 acm程序的设计竞赛 动态规划的讲义

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

也就是把产生过的最优状态,又产
生了一次。为了避免浪费,很显然,
ห้องสมุดไป่ตู้
我们存放一个opt数组:
Opt[i, j] - 每产生一个f(i, j),
将f(i, j)的值放入opt中,以后再
次调用到f(i, j)的时候,直接从
记 忆
opt[i, j]来取就可以了。
于是动态规划的记状忆态化转移的方功程效被直
化 搜 索
观地表示出来了,这样节省了思维 的难度,减少了编程的技巧,而运 行时间只是相差常数的复杂度,而 且在相当多的情况下,递归算法能
更好地避免浪费,在比赛中是非常
实用的.
可以看出动态规划的实质就是







这也就是为什么我们常说动态 规划必须满足重叠子问题的原
因.记忆化,正符合了这个要求.

或许有一种对动态规划的简单

但是以后每一发炮弹都不能高 于前

一发的高度。 某天,雷达捕捉到敌

国的导弹来袭。由于该系统还在试
用阶段,所以 只有一套系统,因此
有可能不能拦截所有的导弹。输入
导弹依次飞来的高度,计算这套系 统最多能拦截多少导弹。
状态的表示-f[i],表示当第i个导 弹必须选择时,前i个导弹最多能拦 截多少。

状态.但阶段不是以前状态,状态是
决 策
阶段的表现形式.数字三角形的以前 状态就是当前层的前一层.
那什么是决策呢?我们看看下面一
张图就知道了.
显然,从上图可以看出,当前状态通
决 过决策,回到了以前状态.可见决策 策 其实就是状态之间的桥梁。而以前
状态也就决定了当前状态的情况。
数字三角形的决策就是选择相邻的两 个以前状态的最优值。
如上例,不难得出一个非常简单的 递归过程 :

f1:=f(i-1,j+1); f2:=f(i-1,j);

if f1>f2 then f:=f1+a[i,j] else f:=f2+a[i,j];

显而易见,这个算法就是最简单的

搜索算法。时间复杂度为2n,明显

是会超时的。分析一下搜索的过程, 实际上,很多调用都是不必要的,

当L1<X<=L2时,票价为C2元. 当L2<X<=L3时,票价为C3元.
当两站距离大于L3时没有直达票,所以有时候要买几
次票做几次车才行。
比如,在上面的例图中,2-6没有直达票,有几种买 票
方法可以从2-6,其中一种是买C2元的2-3车票,再 买
C3元的3-6车票。
给定起点站和终点站还有 L1,L2,L3,C1,C2,C3,求出要从 起点到终点最少要花多少钱.

每个导弹有一定的高度,当前状态
截 导
就是以第i个导弹为最后一个打的导
弹。以前状态就是在这个导弹以前 打的那个导弹。

显然这是十分能够体现状态间的联
系的题目。


给出两个字符串序列。求出这 样的一个最长的公共子串:子

串中的每个字符都能在两个原

串中找到,而且每个字符的顺

序和原串中的顺序一致。
买 车 票
怎 么 办
当前所在的某个车站



这一题的以前状态其实只有3种.即 满足3种距离(收费)情况的3个车站.
要知道这3个车站可以先做一个预
处理.显然这3个车站在满足距离限
制的条件下应该越远越好.
预处理
很容易想出一个N^2的预处理,但是那
样是会超时的.由于尽量要让车站离得
远(费用是一样的啊 )因此在每种收

交错匹配(最长公共子串的改编)
给你两排数字,只能将两排中数字相同的两个位置相
连,而每次相连必须有两个匹配形成一次交错,交错
的连线不能再和别的交错连线有交点.问这两排数字

最多能形成多少个交错匹配.

1 2 3 3 2 4 1 5 1 3 5 10

3 1 2 3 2 4 12 1 5 5 3

浙江大学 acm程序的设计竞赛 动态
给你一个数字三角形, 形式如下:
1

23

456
三 角 形
7 8 9 10 找出从第一层到最后一层的一条
路,使得所经过的权值之和最小或
者最大.
无论对与新手还是老手,这都是再 熟悉不过的题了,很容易地,我们 写出状态转移方程:f(i, j)=a[i, j]
状态的表示-f[i,j]表示前i个第一排的数字
和前j个第二排的数字搭配的最优值。
当前的状态就是当前你枚举到的一组交错 的后面两个位置.例如上图中当前状态是3 和1(第一组交错),枚举他的以前状态就有1 3.这样在1 3之前会有一个最优值存在,因 此可以由此得到3 1的最优值.
买车票(Ural1031)

规 的
我们一般在动规的时候所用到的一
些数组,也就是用来存储每个状态 的最优值的。

我们就从动态规划的要诀,也就是

核心部分“状态”开始,来逐步了

解动态规划。


拦截导弹(Noip2019)
某国为了防御敌国的导弹袭击,发
展出一种导弹拦截系统。但是这种

导弹拦截系统 有一个缺陷:虽然它 的第一发炮弹能够到达任意的高度,
费情况下,每个车站的以前状态车站一
定是递增的序列.这里是只要O(N)的程

序:

for j:=1 to 3 do begin

k:=en-1; for i:=en downto be do
begin

+ min{f(i-1, j)+f(i-1, j + 1)}

对于动态规划算法解决这个问题,
三 角 形
我们根据状态转移方程和状态转移 方向,比较容易地写出动态规划的 循环表示方法。但是,当状态和转 移非常复杂的时候,也许写出循环
式的动态规划就不是那么简单了。
解决方法:
我们尝试从正面的思路去分析问题,

称法,叫分阶段决策.其实我认为
阶 段 决
这个称法并不是很能让人理解. 那么下面我们来看看阶段,状态, 决策这三者间得关系吧.

状态是表现出动态规划核心思想的
一个东西.而分阶段决策这个东西有

似乎没有提到状态,这是不科学的.
态 阶
阶段,有些题目并不一定表现出一定 的阶段性.数字三角形的阶段就是每 一层.这里我们引入一个概念---以前
Ekaterinburg城到Sverdlovsk
城有直线形的铁路线。
买 车 票
两城之间还有其他一些停靠站, 总站数为N。 各站按照离Ekaterinburg城的 距离编号。
Ekaterinburg城编号为1,
Sverdlovsk城编号为N。

某两站之间车票价格由这两站的距离X决定.

当0<X<=L1时,票价为C1元.
相关文档
最新文档