1. 按状态类型分
写在前面:
从状态类型分,并不表示一题只从属于一类。其实一类只是一种状态的表示方法。可以好几种方法组合成一个状态,来解决问题。
1.1. 编号(长度)动态规划
共性总结
本类的状态是基础的基础,大部分的动态规划都要用到它,成为一个维。
一般来说,有两种编号的状态:
状态(i)表示前i个元素决策组成的一个状态。
状态(i)表示用到了第i个元素,和其他在1到i-1间的元素,决策组成有的一个状态。
题库
a) 最长不下降子序列
以一元组(i)作为状态,表示第i个作为序列的最后一个点的时候的最长序列。于是很容易想到O(n2)得算法。但本题可合理组织状态,引入一个单调的辅助数组,利用单调性二分查找,优化到O(nlogn)。关于优化详见优化章。
一些问题可将数据有序化,转化成本题。
应用:
拦截导弹(NOIP99 Advance 1) 就是原题。
Beautiful People (sgu199),要将数据有序化:其中一个权作为第一关键字不下降排列,另一个权作为第二关键字不上升。
Segment (ural 1078),将线段的左端点有序化就可以了。
b) LCS
状态(i,j),表示第1个字符串的第i位,与第2个字符串的第j位匹配,得到的最长的串。若有多个串要LCS,则加维,即几个串就几个维。我也将此题归入路径问题。
c) 花店橱窗布置(IOI99)
见路径问题。
1.2. 区间动态规划
共性总结
本类问题与下一章的划分问题的决策的分割点无序交集比较大(占本类问题的30%)。
题库
a) 石子合并
见划分问题
b) 模版匹配(CEOI01,Patten)
这题特殊的地方是状态的值是一个集合而不是一个数。
c) 不可分解的编码(ACM World Final 2002)
d) Electric Path(ural1143)
e) 邮局(IOI2000 Day2 1)
若状态表示的思路从第i个村庄可以从属于哪个邮局,无最优子结构。转变一个方向:第k个邮局可以“控制”一个区间的村庄[i,j]。于是方程就显然了:
f(k,i,j)=min{f(k-1,p,i-1)+w(i,j)}(k-1<=p<=i-1)
S(i) 为村庄i到原点的距离。
w(i,j)=min{k| Sum{|S(k)-S(p)|}(i<=p<=j)}(i<=k<=j) 找到[i,j]间最好的一个邮局点。
不过可以发现Sum{|S(k)-S(p)|是单调的,所以取中位数就可以了。即上式中k的取值范围只有floor((i+j)/2), ceil((i+j)/2)两个。Floor是下取整。Ceil是上取整。这样每次转移时间降到O(1)。
注意到是区间连续的,即(p,i-1) 和(i, j) 中的 i-1, i是连续的,所以空间可以降维:f(i,j)表示放前i个邮局到前j个村庄的最优值。
f(i,j)=min{f(i-1,p-1)+w(p,j)}(i-1<=p<=j-1}
e(i,j) 为当f(i,j)到达最优值时的p.
通过证明四边形不等式,得到e(i,j)<=e(i,j+1)<=e(i+1,j+1)
决策数量又少了一个数量级。
1.3. 坐标动态规划
共性总结
之后的一些问题,状态是由坐标维与其他的维组成。本类与划分问题(是2维或多维的坐标系的划分)与路径问题的交集占本类问题中大多数。
题库
a) 棋盘分割(NOI99 4)
主要是将公式变形,变形后的公式很容易看出方程。
状态是由2个坐标组成的4元组(x1,y1)(x2,y2),表示一个子棋盘。这有点像之前的区间动态规划,只不过是将1维转2维。
后见路径问题。
1.4. 数轴动态规划
共性总结
题库
a) 01背包
应用:
装箱问题(NOIP01 Trade 4)
就是原题。
值币分割
可利用方程的性质,空间降1维。
币值可重复的值币分割(pku1742, Problem F LouTianCheng’s Contest in POJ)
使用左右法在定位上加速。
另给状态加一个属性last,记录上一次剩下的可用的同币值硬币数(利用了当前转移是唯一前驱的特点)。
b) 取火柴问题(sgu153 Playing with matches)
c) Stone Pile(ural1005 Stone Pile)
d) 公路巡逻(CTSC2000)
1.5. 5.树型动态规划
共性总结
1) 动态规划的顺序
一般按照后序遍历的顺序,即处理完儿子再处理当前节点,才符合树的子结构的性质。
2) 多叉树转换为二叉树
由于要分配附加维到各个节点,而分配附加维是个划分问题,若还是按当前节点到各个儿子节点分配,则成了一个整数划分问题,O(n 2)。所以要把多叉树转换为二叉树,这样才能按动态规划的方式只决策当前点的分配问题, O(n )。
3) 加当前点的选或不选的常数维
加此维解决的是后效性问题。
……………………
4) 在将边信息转成树时的技巧
将读入的边分裂成2条边,将这2条边关联起来(就是找到一条边,另一条边的编号就知道)。用前向星表示法表示边(按起点有序),以后用边的时候,用了一条边打不可用标志,也将关联边打不可用标志。这样可以保证O(n)的时间完成信息处理,而且在父节点找儿子的过程中带来很大的方便。
5) 复杂度
树型动态规划复杂度基本上是O(n);若有附加维m,则是O(nm)。
题库
a) 选课(CTSC97-3)
由于要分配课程数,所以要多叉树转换为二叉树。
b) 贪吃的九头龙(NOI02-3)
若小头数大于1的话,则让不同的小头吃一段树枝的2个端点。
这样就把问题转化成:附加维是大头吃的个数,当前点由不由大头吃的常数维的动态规划。由于涉及划分问题,所以要多叉树转换为二叉树。
c) 求树的质心(sgu134 Centroid)
给出一棵边不带权的树,求点,使得去掉此点后,剩下的最大的连通子图的顶点数最小.
d) 求树中的点最远距离最近。
给出一棵边带权的树,求树中的点,使得此点到树中的其他结点的最远距离最近。
Computer Network (sgu149)
Computer Net (ural1056)
1.6. 集合动态规划(状态压缩)
共性总结
1) 数据特殊性
给出的数据在某一个或几个维度上一般具有比较小的范围(可以枚举一类的状态)。
一个枚举的状态是一个集合。
2) 编码
由于集合中元素个数的不定性或范围大,直接开数组存,不好索引数组(编程复杂度太高),所以要将集合编码。
利用数据的可枚举性,将枚举的状态(集合)编码。一般来说码值的范围要很小(尽量排除无用的码值,如炮兵:当前格和上格存在炮兵的情况是非法的,可以排除)。
规定编码的码值代表的意思,要尽量规定好维护的码值。(如炮兵:当前格存在炮兵的用2,上格存在炮兵用1。这样下一层的规划时,只要码值-1即可)。
有时候可以直接利用编码的顺序动态规划,因为这时编码已经是拓补有序。如TSP问题当前已选点集合的状态的前驱的编码的值一定比当前的编码的值小。
3) 状态压缩
对有限阶段的放置情况,行走情况编码(其实质也是放置的集合或行走路线的集合),这样的编码,也有人谓之:“状态压缩”。此类题以“炮兵阵地”为典型,进行扩展。
题库
a) 购物(IOI95-2)
可将每种物品按5进制编码。(5为每种物品数的上限)
由于物品数的上限为5,比较小,也可直接开数组存。
b) Roger游戏任务一(CTSC98 Day2 4)
一个正方体在一个方格内的状态只有24种,而且可以通过顶面和前面来表示,这样用3维的状态(x,y,p)就可以解决,p为1到24种状态中的一种。
c) TSP问题
观察一下TSP的搜索过程: for (x in 未选点) TSP(x)
即当前路的最后一个节点为x,现在要选择下一个节点y,而y要在未选点的集合中。若未选点或已选点的集合已确定,则后效性消除。可以DP。状态为令X为当前路的已选点的集合(含i),当前路的最后一个节点为i。2元组(X,i)为经过已选点的集合X到节点i的最短长度。将X编码即可。
注意:并没有因为动态规划将问题从NP类带到P类。
应用: DNA Laboratory(Problem B,TU-Darmstadt Programming Contest 2004)
将每个串的交迭部分求出,就可以将问题专成TSP
但要输出字典序最小的,则需要注意DP顺序。
有具体的报告。
d) 炮兵阵地
十分经典,详见报告。
应用:
Another Chocolate Maniac(sgu132) 类似炮兵的做法的最值,只不过是求最小值,麻烦点。
Hardwood floor(sgu131) 类似炮兵的做法的统计
Little Knights(sgu225) 类似炮兵的做法的统计,数据量太大要const
Little Kings(sgu223) 类似炮兵的做法的统计
Bugs公司(CEOI 2002) 类似炮兵的做法的最值
1.7. 利用动态规划思想求最值,编号(循环变量)的迭代
共性总结
要利用上次的一些运算“剩下”的循环变量作当前循环的边界,主要在于找出一种决策顺序,使之成立。
题库
a) 奶牛浴场
b) Communication System
将数据有序化, 从大到小枚举带宽, 每次可利用上次处理的结果Min, 来决策当前状态。称作迭代, 或就是一种动态规划。
(zju1409, Problem C Tehran 2002 Iran Nationwide Internet Programming Contest)
1.8. 记忆化搜索
题库
a) Magic Trick (Problem G, TU-Darmstadt Programming Contest 2004)
2. 按转移方式分
2.1. 存在性
递推
1)01统计(CTSC99 1)
2)卡特兰数
circle(sgu130)
3)鹰蛋
2.2. 求一系列的分割(合并)点(划分问题)
2.2.1. 决策的分割点有序
共性总结
a) 有序性
每次决策的点的编号是有序的,即要按决策的顺序输出分割点的编号的话,编号是有序的,满足分割点的编号按升序排列。
b) 方程一般形式
f(n,m)=optimize{f(k,m-1)+w(k+1,n)}
(n,m)表示从1到n个点中划分为m个部分的最优值;k为决策的分割点,即第m个部分为k+1到n;这里optimize可以为max,min。
题库
a) 整数划分
常应用在将一个权分配给一定的小分割块,如:将大堆的石子分成一定的小堆,小堆可为空,大堆要分完。有时应用在树型动态规划(二叉转多叉)中。
b) 乘积最大(NOIP00 Advance 2)
就是按上面的一般式的方程做。
2.2.2. 决策的分割点无序
共性总结
a) 无序性
每次决策的点的编号是无序的,即要按决策的递归顺序输出分割点的编号的话,编号是无序的。
b) 方程一般形式
f(i,j)=optimize{f(i,k-1)+f(k+1,j)}+w(i,j)
(i,j)表示从i到j的范围内选取一个分割点k的最优值,子问题是分割点左边(i,k-1)和右边(k+1,j)的点的范围的最优值;这里optimize可以为max,min。
方程很类似2叉树的性质。
c) 四边形不等式
此类的问题,有些可用四边形不等式优化。见优化章。
题库
a) 石子合并(NOI95 2)
经典,详见报告。
可用四边形不等式优化成O(n2)
其实还可以用类似堆的数据结构在O(nlogn)的时间内完成,但这就不是动态规划了。
应用:
构造最优二叉排序树(CTSC96 2)
b) 多边形(IOI98)
这题值的正负号处理要注意,乘法运算,由于符号的加入,使原本的正的最优解,一下变成负的。
c) 加分二叉树(NOIP03 Advance 3)
方程就是一般式,转移的函数:w(i,j)=sum(i,k-1)*sum(k+1,j)+d(k)。由于w(i,j)不满足凸单调性,所以不能用四边形不等式优化。
d) 括号序列(Problem B, NEERC 2001)
这题的分割点不是一个元素,而是元素间的一条线。
主要的思维方式是从递归定义。
2.3. 路径问题
共性总结
a) 行走方向决定阶段性
有规定源点与终点。每次行走方向都有一定的规定,使原点到终点的所有路径形成无环有向图。
b) 多源或多汇
当多源或多汇时,应该加维,使得每个源,都有一个路径的状态与之对应。如有n个源的网格类问题,常常转态是(x1,y1)(x2,y2)…(xn,yn)。但是源太多的话,空间上不允许,可以降问题转成网络流问题。
c) 双向动态规划
由于有规定源点与终点,可以双向动态规划,但要考虑效果好不好,理论上是比原来少1/2,但有时由于可用于决策的状态较少,效果就不错了。
d) 决策稀疏性
就是所谓走法,若对于一个状态,它的前驱或者后继数很少(从无环有向图角度,就是入度或出度少),称决策稀疏。
e) 状态稀疏性
就是很多状态是没有用的,如排列的LCS,状态为2维的(x,y),但对于一个x只有一个y是有效个。所以实质上状态数还是线形的。
本类一些技巧性的东西较多,在题库中具体说明。
题库
a) 方格取数(NOIP00 advance 4)
(x1,y1)(x2,y2)
对角线空间优化
b) 花店橱窗布置(IOI99)
我对本题有个小改造:若花瓶无序,如何做,有序指:对于花束i<花束j, 花束i对应的花瓶编号<花束j对应的花瓶编号。那么这样就是一个NP问题了,可用后面的基于状态压缩的动态规划解决。
3. 动态规划的优化
3.1. 迭代
3.2. 四边形
3.3. 凸性的优化
最主要的未总结,给出相关的题与已有的报告(自己或他人的)
转自:http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html
题目:
容易:
1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029, , 2063, 2081, 2082, 2181, 2184, 2192, 2231, 2279, 2329, 2336, 2346, 2353, 2355, 2356, 2385, 2392, 2424,
不易:
1019, 1037, 1080, 1112, 1141, 1170, 1192, 1239, 1655, 1695, 1707, 1733, 1737, 1837, 1850, 1920, 1934, 1937, 1964, 2039, 2138, 2151, 2161, 2178,
推荐:
1015, 1635, 1636, 1671, 1682, 1692, 1704, 1717, 1722, 1726, 1732, 1770, 1821, 1853, 1949, 2019, 2127, 2176, 2228, 2287, 2342, 2374, 2378, 2384, 2411
1015 Jury Compromise
1029 False coin
1036 Gangsters
1037 A decorative fence
1038 Bugs Integrated, Inc.
1042 Gone Fishing
1050 To the Max
1062 昂贵的聘礼
1074 Parallel Expectations
1080 Human Gene Functions
1088 滑雪
1093 Formatting Text
1112 Team Them Up!
1141 Brackets Sequence
1143 Number Game
1157 LITTLE SHOP OF FLOWERS
1159 Palindrome
1160 Post Office
1163 The Triangle
1170 Shopping Offers
1178 Camelot
1179 Polygon
1180 Batch Scheduling
1185 炮兵阵地
1187 陨石的秘密
1189 钉子和小球
1191 棋盘分割
1192 最优连通子集
1208 The Blocks Problem
1239 Increasing Sequences
1240 Pre-Post-erous!
1276 Cash Machine
1293 Duty Free Shop
1322 Chocolate
1323 Game Prediction
1338 Ugly Numbers
1390 Blocks
1414 Life Line
1432 Decoding Morse Sequences
1456 Supermarket
1458 Common Subsequence
1475 Pushing Boxes
1485 Fast Food
1505 Copying Books
1513 Scheduling Lectures
1579 Function Run Fun
1609 Tiling Up Blocks
1631 Bridging signals 2分+DP NLOGN
1633 Gladiators
1635 Subway tree systems
1636 Prison rearrangement
1644 To Bet or Not To Bet
1649 Market Place
1651 Multiplication Puzzle
1655 Balancing Act
1661 Help Jimmy
1664 放苹果
1671 Rhyme Schemes
1682 Clans on the Three Gorges
1690 (Your)((Term)((Project)))
1691 Painting A Board
1692 Crossed Matchings
1695 Magazine Delivery
1699 Best Sequence
1704 Georgia and Bob
1707 Sum of powers
1712 Flying Stars
1714 The Cave
1717 Dominoes
1718 River Crossing
1722 SUBTRACT
1726 Tango Tango Insurrection
1732 Phone numbers
1733 Parity game
1737 Connected Graph
1740 A New Stone Game
1742 Coins P
1745 Divisibility
1770 Special Experiment
1771 Elevator Stopping Plan
1776 Task Sequences
1821 Fence
1837 Balance
1848 Tree
1850 Code
1853 Cat
1874 Trade on Verweggistan
1887 Testing the CATCHER
1889 Package Pricing
1920 Towers of Hanoi
1926 Pollution
1934 Trip
1936 All in All
1937 Balanced Food
1946 Cow Cycling
1947 Rebuilding Roads
1949 Chores
1952 BUY LOW, BUY LOWER
1953 World Cup Noise
1958 Strange Towers of Hanoi
1959 Darts
1962 Corporative Network
1964 City Game
1975 Median Weight Bead
1989 The Cow Lineup
2018 Best Cow Fences
2019 Cornfields
2029 Get Many Persimmon Trees
2033 Alphacode
2039 To and Fro
2047 Concert Hall Scheduling
2063 Investment
2081 Recaman's Sequence
2082 Terrible Sets
2084 Game of Connections
2127 Greatest Common Increasing Subsequence
2138 Travel Games
2151 Check the difficulty of problems
2152 Fire
2161 Chandelier
2176 Folding
2178 Heroes Of Might And Magic
2181 Jumping Cows
2184 Cow Exhibition
2192 Zipper
2193 Lenny's Lucky Lotto Lists
2228 Naptime
2231 Moo Volume
2279 Mr. Young's Picture Permutations
2287 Tian Ji -- The Horse Racing
2288 Islands and Bridges
2292 Optimal Keypad
2329 Nearest number - 2
2336 Ferry Loading II
2342 Anniversary party
2346 Lucky tickets
2353 Ministry
2355 Railway tickets
2356 Find a multiple
2374 Fence Obstacle Course
2378 Tree Cutting
2384 Harder Sokoban Problem
2385 Apple Catching
2386 Lake Counting
2392 Space Elevator
2397 Spiderman
2411 Mondriaan's Dream
2414 Phylogenetic Trees Inherited
2424 Flo's Restaurant
2430 Lazy Cows
2915 Zuma
3017 Cut the Sequence
3028 Shoot-out
3124 The Bookcase
3133 Manhattan Wiring
3345 Bribing FIPA
3375 Network Connection
3420 Quad Tiling
转自:http://cippus.dlut.edu.cn/forum/posts/list/45.page
写在前面:
从状态类型分,并不表示一题只从属于一类。其实一类只是一种状态的表示方法。可以好几种方法组合成一个状态,来解决问题。
1.1. 编号(长度)动态规划
共性总结
本类的状态是基础的基础,大部分的动态规划都要用到它,成为一个维。
一般来说,有两种编号的状态:
状态(i)表示前i个元素决策组成的一个状态。
状态(i)表示用到了第i个元素,和其他在1到i-1间的元素,决策组成有的一个状态。
题库
a) 最长不下降子序列
以一元组(i)作为状态,表示第i个作为序列的最后一个点的时候的最长序列。于是很容易想到O(n2)得算法。但本题可合理组织状态,引入一个单调的辅助数组,利用单调性二分查找,优化到O(nlogn)。关于优化详见优化章。
一些问题可将数据有序化,转化成本题。
应用:
拦截导弹(NOIP99 Advance 1) 就是原题。
Beautiful People (sgu199),要将数据有序化:其中一个权作为第一关键字不下降排列,另一个权作为第二关键字不上升。
Segment (ural 1078),将线段的左端点有序化就可以了。
b) LCS
状态(i,j),表示第1个字符串的第i位,与第2个字符串的第j位匹配,得到的最长的串。若有多个串要LCS,则加维,即几个串就几个维。我也将此题归入路径问题。
c) 花店橱窗布置(IOI99)
见路径问题。
1.2. 区间动态规划
共性总结
本类问题与下一章的划分问题的决策的分割点无序交集比较大(占本类问题的30%)。
题库
a) 石子合并
见划分问题
b) 模版匹配(CEOI01,Patten)
这题特殊的地方是状态的值是一个集合而不是一个数。
c) 不可分解的编码(ACM World Final 2002)
d) Electric Path(ural1143)
e) 邮局(IOI2000 Day2 1)
若状态表示的思路从第i个村庄可以从属于哪个邮局,无最优子结构。转变一个方向:第k个邮局可以“控制”一个区间的村庄[i,j]。于是方程就显然了:
f(k,i,j)=min{f(k-1,p,i-1)+w(i,j)}(k-1<=p<=i-1)
S(i) 为村庄i到原点的距离。
w(i,j)=min{k| Sum{|S(k)-S(p)|}(i<=p<=j)}(i<=k<=j) 找到[i,j]间最好的一个邮局点。
不过可以发现Sum{|S(k)-S(p)|是单调的,所以取中位数就可以了。即上式中k的取值范围只有floor((i+j)/2), ceil((i+j)/2)两个。Floor是下取整。Ceil是上取整。这样每次转移时间降到O(1)。
注意到是区间连续的,即(p,i-1) 和(i, j) 中的 i-1, i是连续的,所以空间可以降维:f(i,j)表示放前i个邮局到前j个村庄的最优值。
f(i,j)=min{f(i-1,p-1)+w(p,j)}(i-1<=p<=j-1}
e(i,j) 为当f(i,j)到达最优值时的p.
通过证明四边形不等式,得到e(i,j)<=e(i,j+1)<=e(i+1,j+1)
决策数量又少了一个数量级。
1.3. 坐标动态规划
共性总结
之后的一些问题,状态是由坐标维与其他的维组成。本类与划分问题(是2维或多维的坐标系的划分)与路径问题的交集占本类问题中大多数。
题库
a) 棋盘分割(NOI99 4)
主要是将公式变形,变形后的公式很容易看出方程。
状态是由2个坐标组成的4元组(x1,y1)(x2,y2),表示一个子棋盘。这有点像之前的区间动态规划,只不过是将1维转2维。
后见路径问题。
1.4. 数轴动态规划
共性总结
题库
a) 01背包
应用:
装箱问题(NOIP01 Trade 4)
就是原题。
值币分割
可利用方程的性质,空间降1维。
币值可重复的值币分割(pku1742, Problem F LouTianCheng’s Contest in POJ)
使用左右法在定位上加速。
另给状态加一个属性last,记录上一次剩下的可用的同币值硬币数(利用了当前转移是唯一前驱的特点)。
b) 取火柴问题(sgu153 Playing with matches)
c) Stone Pile(ural1005 Stone Pile)
d) 公路巡逻(CTSC2000)
1.5. 5.树型动态规划
共性总结
1) 动态规划的顺序
一般按照后序遍历的顺序,即处理完儿子再处理当前节点,才符合树的子结构的性质。
2) 多叉树转换为二叉树
由于要分配附加维到各个节点,而分配附加维是个划分问题,若还是按当前节点到各个儿子节点分配,则成了一个整数划分问题,O(n 2)。所以要把多叉树转换为二叉树,这样才能按动态规划的方式只决策当前点的分配问题, O(n )。
3) 加当前点的选或不选的常数维
加此维解决的是后效性问题。
……………………
4) 在将边信息转成树时的技巧
将读入的边分裂成2条边,将这2条边关联起来(就是找到一条边,另一条边的编号就知道)。用前向星表示法表示边(按起点有序),以后用边的时候,用了一条边打不可用标志,也将关联边打不可用标志。这样可以保证O(n)的时间完成信息处理,而且在父节点找儿子的过程中带来很大的方便。
5) 复杂度
树型动态规划复杂度基本上是O(n);若有附加维m,则是O(nm)。
题库
a) 选课(CTSC97-3)
由于要分配课程数,所以要多叉树转换为二叉树。
b) 贪吃的九头龙(NOI02-3)
若小头数大于1的话,则让不同的小头吃一段树枝的2个端点。
这样就把问题转化成:附加维是大头吃的个数,当前点由不由大头吃的常数维的动态规划。由于涉及划分问题,所以要多叉树转换为二叉树。
c) 求树的质心(sgu134 Centroid)
给出一棵边不带权的树,求点,使得去掉此点后,剩下的最大的连通子图的顶点数最小.
d) 求树中的点最远距离最近。
给出一棵边带权的树,求树中的点,使得此点到树中的其他结点的最远距离最近。
Computer Network (sgu149)
Computer Net (ural1056)
1.6. 集合动态规划(状态压缩)
共性总结
1) 数据特殊性
给出的数据在某一个或几个维度上一般具有比较小的范围(可以枚举一类的状态)。
一个枚举的状态是一个集合。
2) 编码
由于集合中元素个数的不定性或范围大,直接开数组存,不好索引数组(编程复杂度太高),所以要将集合编码。
利用数据的可枚举性,将枚举的状态(集合)编码。一般来说码值的范围要很小(尽量排除无用的码值,如炮兵:当前格和上格存在炮兵的情况是非法的,可以排除)。
规定编码的码值代表的意思,要尽量规定好维护的码值。(如炮兵:当前格存在炮兵的用2,上格存在炮兵用1。这样下一层的规划时,只要码值-1即可)。
有时候可以直接利用编码的顺序动态规划,因为这时编码已经是拓补有序。如TSP问题当前已选点集合的状态的前驱的编码的值一定比当前的编码的值小。
3) 状态压缩
对有限阶段的放置情况,行走情况编码(其实质也是放置的集合或行走路线的集合),这样的编码,也有人谓之:“状态压缩”。此类题以“炮兵阵地”为典型,进行扩展。
题库
a) 购物(IOI95-2)
可将每种物品按5进制编码。(5为每种物品数的上限)
由于物品数的上限为5,比较小,也可直接开数组存。
b) Roger游戏任务一(CTSC98 Day2 4)
一个正方体在一个方格内的状态只有24种,而且可以通过顶面和前面来表示,这样用3维的状态(x,y,p)就可以解决,p为1到24种状态中的一种。
c) TSP问题
观察一下TSP的搜索过程: for (x in 未选点) TSP(x)
即当前路的最后一个节点为x,现在要选择下一个节点y,而y要在未选点的集合中。若未选点或已选点的集合已确定,则后效性消除。可以DP。状态为令X为当前路的已选点的集合(含i),当前路的最后一个节点为i。2元组(X,i)为经过已选点的集合X到节点i的最短长度。将X编码即可。
注意:并没有因为动态规划将问题从NP类带到P类。
应用: DNA Laboratory(Problem B,TU-Darmstadt Programming Contest 2004)
将每个串的交迭部分求出,就可以将问题专成TSP
但要输出字典序最小的,则需要注意DP顺序。
有具体的报告。
d) 炮兵阵地
十分经典,详见报告。
应用:
Another Chocolate Maniac(sgu132) 类似炮兵的做法的最值,只不过是求最小值,麻烦点。
Hardwood floor(sgu131) 类似炮兵的做法的统计
Little Knights(sgu225) 类似炮兵的做法的统计,数据量太大要const
Little Kings(sgu223) 类似炮兵的做法的统计
Bugs公司(CEOI 2002) 类似炮兵的做法的最值
1.7. 利用动态规划思想求最值,编号(循环变量)的迭代
共性总结
要利用上次的一些运算“剩下”的循环变量作当前循环的边界,主要在于找出一种决策顺序,使之成立。
题库
a) 奶牛浴场
b) Communication System
将数据有序化, 从大到小枚举带宽, 每次可利用上次处理的结果Min, 来决策当前状态。称作迭代, 或就是一种动态规划。
(zju1409, Problem C Tehran 2002 Iran Nationwide Internet Programming Contest)
1.8. 记忆化搜索
题库
a) Magic Trick (Problem G, TU-Darmstadt Programming Contest 2004)
2. 按转移方式分
2.1. 存在性
递推
1)01统计(CTSC99 1)
2)卡特兰数
circle(sgu130)
3)鹰蛋
2.2. 求一系列的分割(合并)点(划分问题)
2.2.1. 决策的分割点有序
共性总结
a) 有序性
每次决策的点的编号是有序的,即要按决策的顺序输出分割点的编号的话,编号是有序的,满足分割点的编号按升序排列。
b) 方程一般形式
f(n,m)=optimize{f(k,m-1)+w(k+1,n)}
(n,m)表示从1到n个点中划分为m个部分的最优值;k为决策的分割点,即第m个部分为k+1到n;这里optimize可以为max,min。
题库
a) 整数划分
常应用在将一个权分配给一定的小分割块,如:将大堆的石子分成一定的小堆,小堆可为空,大堆要分完。有时应用在树型动态规划(二叉转多叉)中。
b) 乘积最大(NOIP00 Advance 2)
就是按上面的一般式的方程做。
2.2.2. 决策的分割点无序
共性总结
a) 无序性
每次决策的点的编号是无序的,即要按决策的递归顺序输出分割点的编号的话,编号是无序的。
b) 方程一般形式
f(i,j)=optimize{f(i,k-1)+f(k+1,j)}+w(i,j)
(i,j)表示从i到j的范围内选取一个分割点k的最优值,子问题是分割点左边(i,k-1)和右边(k+1,j)的点的范围的最优值;这里optimize可以为max,min。
方程很类似2叉树的性质。
c) 四边形不等式
此类的问题,有些可用四边形不等式优化。见优化章。
题库
a) 石子合并(NOI95 2)
经典,详见报告。
可用四边形不等式优化成O(n2)
其实还可以用类似堆的数据结构在O(nlogn)的时间内完成,但这就不是动态规划了。
应用:
构造最优二叉排序树(CTSC96 2)
b) 多边形(IOI98)
这题值的正负号处理要注意,乘法运算,由于符号的加入,使原本的正的最优解,一下变成负的。
c) 加分二叉树(NOIP03 Advance 3)
方程就是一般式,转移的函数:w(i,j)=sum(i,k-1)*sum(k+1,j)+d(k)。由于w(i,j)不满足凸单调性,所以不能用四边形不等式优化。
d) 括号序列(Problem B, NEERC 2001)
这题的分割点不是一个元素,而是元素间的一条线。
主要的思维方式是从递归定义。
2.3. 路径问题
共性总结
a) 行走方向决定阶段性
有规定源点与终点。每次行走方向都有一定的规定,使原点到终点的所有路径形成无环有向图。
b) 多源或多汇
当多源或多汇时,应该加维,使得每个源,都有一个路径的状态与之对应。如有n个源的网格类问题,常常转态是(x1,y1)(x2,y2)…(xn,yn)。但是源太多的话,空间上不允许,可以降问题转成网络流问题。
c) 双向动态规划
由于有规定源点与终点,可以双向动态规划,但要考虑效果好不好,理论上是比原来少1/2,但有时由于可用于决策的状态较少,效果就不错了。
d) 决策稀疏性
就是所谓走法,若对于一个状态,它的前驱或者后继数很少(从无环有向图角度,就是入度或出度少),称决策稀疏。
e) 状态稀疏性
就是很多状态是没有用的,如排列的LCS,状态为2维的(x,y),但对于一个x只有一个y是有效个。所以实质上状态数还是线形的。
本类一些技巧性的东西较多,在题库中具体说明。
题库
a) 方格取数(NOIP00 advance 4)
(x1,y1)(x2,y2)
对角线空间优化
b) 花店橱窗布置(IOI99)
我对本题有个小改造:若花瓶无序,如何做,有序指:对于花束i<花束j, 花束i对应的花瓶编号<花束j对应的花瓶编号。那么这样就是一个NP问题了,可用后面的基于状态压缩的动态规划解决。
3. 动态规划的优化
3.1. 迭代
3.2. 四边形
3.3. 凸性的优化
最主要的未总结,给出相关的题与已有的报告(自己或他人的)
转自:http://www.cppblog.com/cdy20/archive/2009/03/17/76889.html
题目:
容易:
1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029, , 2063, 2081, 2082, 2181, 2184, 2192, 2231, 2279, 2329, 2336, 2346, 2353, 2355, 2356, 2385, 2392, 2424,
不易:
1019, 1037, 1080, 1112, 1141, 1170, 1192, 1239, 1655, 1695, 1707, 1733, 1737, 1837, 1850, 1920, 1934, 1937, 1964, 2039, 2138, 2151, 2161, 2178,
推荐:
1015, 1635, 1636, 1671, 1682, 1692, 1704, 1717, 1722, 1726, 1732, 1770, 1821, 1853, 1949, 2019, 2127, 2176, 2228, 2287, 2342, 2374, 2378, 2384, 2411
1015 Jury Compromise
1029 False coin
1036 Gangsters
1037 A decorative fence
1038 Bugs Integrated, Inc.
1042 Gone Fishing
1050 To the Max
1062 昂贵的聘礼
1074 Parallel Expectations
1080 Human Gene Functions
1088 滑雪
1093 Formatting Text
1112 Team Them Up!
1141 Brackets Sequence
1143 Number Game
1157 LITTLE SHOP OF FLOWERS
1159 Palindrome
1160 Post Office
1163 The Triangle
1170 Shopping Offers
1178 Camelot
1179 Polygon
1180 Batch Scheduling
1185 炮兵阵地
1187 陨石的秘密
1189 钉子和小球
1191 棋盘分割
1192 最优连通子集
1208 The Blocks Problem
1239 Increasing Sequences
1240 Pre-Post-erous!
1276 Cash Machine
1293 Duty Free Shop
1322 Chocolate
1323 Game Prediction
1338 Ugly Numbers
1390 Blocks
1414 Life Line
1432 Decoding Morse Sequences
1456 Supermarket
1458 Common Subsequence
1475 Pushing Boxes
1485 Fast Food
1505 Copying Books
1513 Scheduling Lectures
1579 Function Run Fun
1609 Tiling Up Blocks
1631 Bridging signals 2分+DP NLOGN
1633 Gladiators
1635 Subway tree systems
1636 Prison rearrangement
1644 To Bet or Not To Bet
1649 Market Place
1651 Multiplication Puzzle
1655 Balancing Act
1661 Help Jimmy
1664 放苹果
1671 Rhyme Schemes
1682 Clans on the Three Gorges
1690 (Your)((Term)((Project)))
1691 Painting A Board
1692 Crossed Matchings
1695 Magazine Delivery
1699 Best Sequence
1704 Georgia and Bob
1707 Sum of powers
1712 Flying Stars
1714 The Cave
1717 Dominoes
1718 River Crossing
1722 SUBTRACT
1726 Tango Tango Insurrection
1732 Phone numbers
1733 Parity game
1737 Connected Graph
1740 A New Stone Game
1742 Coins P
1745 Divisibility
1770 Special Experiment
1771 Elevator Stopping Plan
1776 Task Sequences
1821 Fence
1837 Balance
1848 Tree
1850 Code
1853 Cat
1874 Trade on Verweggistan
1887 Testing the CATCHER
1889 Package Pricing
1920 Towers of Hanoi
1926 Pollution
1934 Trip
1936 All in All
1937 Balanced Food
1946 Cow Cycling
1947 Rebuilding Roads
1949 Chores
1952 BUY LOW, BUY LOWER
1953 World Cup Noise
1958 Strange Towers of Hanoi
1959 Darts
1962 Corporative Network
1964 City Game
1975 Median Weight Bead
1989 The Cow Lineup
2018 Best Cow Fences
2019 Cornfields
2029 Get Many Persimmon Trees
2033 Alphacode
2039 To and Fro
2047 Concert Hall Scheduling
2063 Investment
2081 Recaman's Sequence
2082 Terrible Sets
2084 Game of Connections
2127 Greatest Common Increasing Subsequence
2138 Travel Games
2151 Check the difficulty of problems
2152 Fire
2161 Chandelier
2176 Folding
2178 Heroes Of Might And Magic
2181 Jumping Cows
2184 Cow Exhibition
2192 Zipper
2193 Lenny's Lucky Lotto Lists
2228 Naptime
2231 Moo Volume
2279 Mr. Young's Picture Permutations
2287 Tian Ji -- The Horse Racing
2288 Islands and Bridges
2292 Optimal Keypad
2329 Nearest number - 2
2336 Ferry Loading II
2342 Anniversary party
2346 Lucky tickets
2353 Ministry
2355 Railway tickets
2356 Find a multiple
2374 Fence Obstacle Course
2378 Tree Cutting
2384 Harder Sokoban Problem
2385 Apple Catching
2386 Lake Counting
2392 Space Elevator
2397 Spiderman
2411 Mondriaan's Dream
2414 Phylogenetic Trees Inherited
2424 Flo's Restaurant
2430 Lazy Cows
2915 Zuma
3017 Cut the Sequence
3028 Shoot-out
3124 The Bookcase
3133 Manhattan Wiring
3345 Bribing FIPA
3375 Network Connection
3420 Quad Tiling
转自:http://cippus.dlut.edu.cn/forum/posts/list/45.page
相关推荐
本资料主要对动态规划进行了全面的总结,旨在帮助读者深入理解和掌握这一概念。 一、动态规划基础 动态规划的核心是将一个复杂的问题分解为多个相互关联的子问题,然后通过解决这些子问题来求解原问题。它与分治法...
动态规划是一种重要的算法思想,广泛应用于计算机科学,特别是在解决最优化问题时。它通过将复杂问题分解成子问题,然后逐步构建最优解,避免了重复计算,提高了效率。本专题课件深入探讨了动态规划的核心原理和应用...
可能是对动态规划深入讲解的一堂课,而 "(HDUACM2010版_04)动态规划.ppt"、"3_ACM动态规划.ppt" 和 "hdu1160.txt" 可能是针对ACM竞赛的动态规划训练资料,特别是"hdu1160.txt"可能是一个具体的背包问题实例。...
本资料包“动态规划精讲”包含了对这一重要算法的深入探讨,旨在帮助学习者深入理解并掌握动态规划的精髓。 动态规划(Dynamic Programming,简称DP)的核心思想是将复杂问题分解为更小的子问题,并存储这些子问题...
本文基于一份资料提供的内容,旨在深入探讨动态规划的基本概念、适用范围及其解决问题的一般思路,并通过具体的分类讨论来加深读者的理解。 #### 第一节 动态规划基本概念 **一、动态规划三要素** 1. **阶段**:...
本资料集合深入分析了四种主要类型的动态规划问题:区间、线性、树形和路径,并提供了相关题目解析。 1. 区间类型动态规划 区间动态规划通常涉及对连续或离散的区间进行操作。例如,区间覆盖问题、区间最值问题等。...
这个名为“dongtaiguihua.rar_dongtaiguihua_动态规划_动态规划 MATLAB”的压缩包文件显然是一份专为大学生设计的MATLAB动态规划学习资料,特别适合那些初学者进行自我提升。 动态规划的核心理念是通过将复杂问题...
这个名为“dongtaiguihua.rar”的压缩包显然包含了关于动态规划的详细资料和实例,旨在帮助用户深入理解和掌握这一算法。 动态规划的核心在于将一个大问题分解为若干个相互关联的子问题,并通过求解子问题来逐步...
本系列教程“动态规划32讲”旨在深入浅出地讲解这一关键算法,为准备参加全国奥林匹克信息学竞赛(NOIP)复赛的学生提供宝贵的参考资料。 动态规划的核心思想是通过将复杂问题分解成更小的子问题来解决,而不是重复...
以下是关于动态规划的一些关键知识点: 1. **基本原理**:动态规划的核心是状态转移方程和最优子结构。状态通常表示为问题的某个阶段或中间结果,而状态转移方程描述了从一个状态到另一个状态的转换过程。最优子...
以下是关于动态规划的一些核心知识点: 1. **基本概念**:动态规划是由美国数学家Richard Bellman提出的,其本质是分治策略的一种延伸。它通过构造一个最优决策序列,使得整个过程的总成本最小或者总收益最大。 2....
通过阅读《高级专题:算法设计与分析(动态规划、贪心法) (1).pdf》这样的资料,你将更深入地了解这两种方法,以及如何在Python中有效地运用它们。 总的来说,动态规划和贪心法是Python编程中解决问题的利器,理解...
本资源包提供了关于动态规划的详尽资料,包括讲解、实例和PPT演示,适合不同层次的学习者。 1. **动态规划基础** 动态规划的核心思想是“重叠子问题”和“最优子结构”。重叠子问题意味着原问题可以分解为若干相同...
在学习动态规划之前,需要了解一些基本概念,如状态、状态变量、决策等。状态是指问题的所有可能到达的情况,包括初始情况和目标情况。状态变量是指对每个状态关联的一个变量,其值表示状态对应的问题的当前解值。...
本资料包聚焦于动态规划的经典题目,旨在帮助学习者深入理解这一算法,并提高解决实际问题的能力。以下是对每个文件中涉及知识点的详细解析: 1. **统计单词个数** 这个题目通常涉及到字符串处理和动态规划。动态...
本资料包“动态规划(dp算法).rar”包含了一份详细的PDF文档,旨在深入探讨这一重要算法。 在学习动态规划时,我们需要理解以下几个核心概念: 1. **最优子结构**:这是动态规划问题的一个关键特征,意味着一个最...
本资料集包含了45道精心挑选的动态规划题目,旨在帮助学习者深入理解和熟练应用这一算法。 动态规划是一种通过分解问题来求解最优化问题的方法,它的核心思想是将原问题分解成若干个子问题,并存储子问题的解,避免...
这些代码不仅可以帮助初学者理解动态规划的原理,而且对于有经验的开发者来说,也是复习和提高的好资料。 在学习和分析这些源码时,关注以下几个方面: - **状态定义**:确定问题的状态空间是什么,通常用数组或...
算法设计与分析学习提纲 第六章 动态规划 本章主要介绍了动态规划的思想方法和实例,以及多段图的最短路径问题的解决方法。 6.1 动态规划的思想方法 动态规划是解决问题的方法之一,它将问题分解成多个阶段,每个...
这个压缩包文件"4第四章 动态规划.zip"显然包含了关于动态规划的详细内容,很可能是一份教程或课程资料。 动态规划的应用场景非常广泛,包括但不限于路径规划、背包问题、最长公共子序列、最短编辑距离、网络流问题...