- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Tom
的 烦 恼
Tom的烦恼 按结束时间排序,枚举结束时间作为 当前状态,以前状态就是该结束时间 对应的起始时间,这是已经确定的.
Tom
文 字 游 戏
文字游戏(fairfox邀请赛1) 给你一份单词表,和一个句子。求出该句 子能有多少中不同的划分方法.例如: 单词是ab cd a b c d 句子是abcd 他共有4种完全划分方案: ab/cd a/b/c/d a/b/cd ab/c/d; 当前状态就是单词在句子中向后靠的位置, 以前状态就是确定这个单词位置以后,除 掉这个单词长度后的一个位置.状态转移 方程是:F[i]:=F[i]+F[ilength(word[j])] IOI中有一题《前缀》也是类似的题目.
拦 截 导 弹
拦 截 导 弹
状态的表示-f[i],表示当第i个导 弹必须选择时,前i个导弹最多能拦 截多少。 每个导弹有一定的高度,当前状态 就是以第i个导弹为最后一个打的导 弹。以前状态就是在这个导弹以前 打的那个导弹。 显然这是十分能够体现状态间的联 系的题目。
最 长 公 共 子 串
给定起点站和终点站还有 L1,L2,L3,C1,C2,C3,求出要从 起点到终点最少要花多少钱.
买 车 票
怎 么 办
当前所在的某个车站
买 车 票
这一题的以前状态其实只有3种.即 满足3种距离(收费)情况的3个车站. 要知道这3个车站可以先做一个预 处理.显然这3个车站在满足距离限 制的条件下应该越远越好.
可以看出动态规划的实质就是
动 态 规 划 的 实 质
这也就是为什么我们常说动态 规划必须满足重叠子问题的原 因.记忆化,正符合了这个要求.
状 态 阶 段 决 策
或许有一种对动态规划的简单 称法,叫分阶段决策.其实我认为 这个称法并不是很能让人理解. 那么下面我们来看看阶段,状态, 决策这三者间得关系吧.
给出两个字符串序列。求出这 样的一个最长的公共子串:子 串中的每个字符都能在两个原 串中找到,而且每个字符的顺 序和原串中的顺序一致。
交错匹配(最长公共子串的改编)
给你两排数字,只能将两排中数字相同的两个位置 相连,而每次相连必须有两个匹配形成一次交错,交 错的连线不能再和别的交错连线有交点.问这两排 数字最多能形成多少个交错匹配.
交 错 匹 配
1 3
2 1
3 2
3 3
2 2
4 4
1 12
5 1
1 5
3 5
5 3
10
状态的表示-f[i,j]表示前i个第一排的数 字和前j个第二排的数字搭配的最优值。 当前的状态就是当前你枚举到的一组交错 的后面两个位置.例如上图中当前状态是3 和1(第一组交错),枚举他的以前状态就有1 3.这样在1 3之前会有一个最优值存在,因 此可以由此得到3 1的最优值.
最 佳 加 法 表 达 式
用f[i,j],表示的是在前i个字符中 插入j个加号能达到的最小值,最 后的答案也就是F[length(s),m]. 于是就有一个动规的方程: F[i,j]:=min(f[i,j],f[k,j1]+num[k+1,i]) num[k+1,i]表 示k+1位到i位所形成的数字.这 里显然是把加号插入了第k+1个 位置上. 知道了这一题怎么做以后,乘积 最大的一题也是完全一样的形式, 谁还会去用搜索?
决 策 中 的 定 量
状态转移方程的构造无疑是动态 规划过程中最重要的一步,也是 最难的一步.对于大多数的动态 规划,寻找状态转移方程有一条 十分高效的通道,就是寻找变化 中的不变量.定量处理的过程也 就是决策实施的过程.
或许你不明白我在说什么,那 么我们通过题目来说明吧
寻 找 定 量
最佳加法表达式 有一个由1..9组成的数字串. 问如果将m个加号插入到这个 数字串中.使得所形成的算术 表达式的值最小.
什 么 是 动 态 规 划
在学习动态规划之前你一定学 过搜索.那么搜索与动态规划有 什么关系呢?我们来下面的一 个例子.
数 字 三 角 形
给你一个数字三角形, 形式如下: 1 2 3 4 5 6 7 8 9 10 找出从第一层到最后一层的一条 路,使得所经过的权值之和最小或 者最大.
数 字 三 角 形
拦截导弹(Noip2002) 某国为了防御敌国的导弹袭击,发 展出一种导弹拦截系统。但是这种 导弹拦截系统 有一个缺陷:虽然它 的第一发炮弹能够到达任意的高度, 但是以后每一发炮弹都不能高 于前 一发的高度。 某天,雷达捕捉到敌 国的导弹来袭。由于该系统还在试 用阶段,所以 只有一套系统,因此 有可能不能拦截所有的导弹。输入 导弹依次飞来的高度,计算这套系 统最多能拦截多少导弹。
ቤተ መጻሕፍቲ ባይዱ
记 忆 化 搜 索
Opt[i, j] - 每产生一个f(i, j), 将f(i, j)的值放入opt中,以后再 次调用到f(i, j)的时候,直接从 opt[i, j]来取就可以了。 记忆化的功效 于是动态规划的状态转移方程被直 观地表示出来了,这样节省了思维 的难度,减少了编程的技巧,而运 行时间只是相差常数的复杂度,而 且在相当多的情况下,递归算法能 更好地避免浪费,在比赛中是非常 实用的.
记 忆 化 搜 索
我们尝试从正面的思路去分析问题, 如上例,不难得出一个非常简单的 递归过程 : 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,明显 是会超时的。分析一下搜索的过程, 实际上,很多调用都是不必要的, 也就是把产生过的最优状态,又产 生了一次。为了避免浪费,很显然, 我们存放一个opt数组:
状 态 阶 段 决 策
状态是表现出动态规划核心思想的 一个东西.而分阶段决策这个东西有 似乎没有提到状态,这是不科学的. 阶段,有些题目并不一定表现出一定 的阶段性.数字三角形的阶段就是每 一层.这里我们引入一个概念---以前 状态.但阶段不是以前状态,状态是 阶段的表现形式.数字三角形的以前 状态就是当前层的前一层. 那什么是决策呢?我们看看下面一 张图就知道了.
决 策
显然,从上图可以看出,当前状态通 过决策,回到了以前状态.可见决策 其实就是状态之间的桥梁。而以前 状态也就决定了当前状态的情况。
数字三角形的决策就是选择相邻的两 个以前状态的最优值。
动 规 的 要 诀 - 状 态
我们一般在动规的时候所用到的一 些数组,也就是用来存储每个状态 的最优值的。 我们就从动态规划的要诀,也就是 核心部分“状态”开始,来逐步了 解动态规划。
买 车 票
预处理 很容易想出一个N^2的预处理,但是那 样是会超时的.由于尽量要让车站离得 远(费用是一样的啊 )因此在每种收 费情况下,每个车站的以前状态车站一 定是递增的序列.这里是只要O(N)的程 序:
for j:=1 to 3 do begin k:=en-1; for i:=en downto be do begin while (way[i]-way[k]<=l[j])and(k>=be) do dec(k); p[i][j]:=k+1; end; end;
现在大概大家已经了解了定量 是什么,那么我们下面通过几道 题目来了解一下定量的威力.
定 量
游 戏
游戏(Noip2003普及组) 这一题的描述简单说一下:在一 个圈的周围有n个石子,将他们 划分成m堆(每堆中的石子必须 连续相邻),每一堆石子计算出 他们的总重量mod10的值,然后 将这些值相乘,求得到的结果最 大最小值是多少.
买 车 票
买车票(Ural1031) Ekaterinburg城到Sverdlovsk 城有直线形的铁路线。 两城之间还有其他一些停靠站, 总站数为N。 各站按照离Ekaterinburg城的 距离编号。 Ekaterinburg城编号为1, Sverdlovsk城编号为N。
买 车 票
某两站之间车票价格由这两站的距离X决定. 当0<X<=L1时,票价为C1元. 当L1<X<=L2时,票价为C2元. 当L2<X<=L3时,票价为C3元. 当两站距离大于L3时没有直达票,所以有时候要买几 次票做几次车才行。 比如,在上面的例图中,2-6没有直达票,有几种买 票 方法可以从2-6,其中一种是买C2元的2-3车票,再买 C3元的3-6车票。
最 佳 加 法 表 达 式
这一题中的定量是什么呢?因为是添 入加号,那么添完加号后,表达式的最 后一定是个数字串,这就是定量.从这 里入手,不难发现可以把以前状态认 为是在前i个字符中插入k-1个加号 (这里的i是当作决策在枚举),然后i+1 到最后一位一定是整个没有被分割 的数字串,第k个加号就添在i与i+1个 数字之间.这样就构造出了整个数字 串的最优解.而至于前i个字符中插入 k-1个加号,这又回到了原问题的形 式,也就是回到了以前状态,所以状态 转移方程就能很快的构造出来了.
数组P[i][j]表示的是I状态的第j种以前状态.
动态规划的部分
for i:=be+1 to en do {枚举当前状态} begin cost[i]:=maxlongint; for j:=1 to 3 do {枚举以前状态} begin if (p[i][j]<>i) and (cost[i] > cost[p[i][j]] + c[j]) then cost[i]:=cost[p[i][j]]+c[j]; end; end;