DP也练了一部分,找感觉。
说一下VIJOS上的。
◆线性连接性的问题(包括分配问题,转换问题,连接问题,及宏观扩展),这样的例子比较多,方程就是由一维来记录处理到的线性位置作为阶段,然后用额外的未来记录分配的情况,之前临近的连接情况等,这样一个一个把状态连接起来得最优
例子:
P1323化工厂装箱员 P1386矿工配餐 P1417魔法塔防 P1421更换轮胎 P1456最小总代价 P1470教主的后花园 P1002过河
◆线性的选择问题
这种就是类似最长不上升子序列之类的那种,当处理到i时,在前面选择一个可能的情况跟他连起来,例子比如说:
P1098合唱队形 P1331看球的巴士
◆开放的划分推进
这种一般就是一个二维的方程,表示把这一段分在一起,可以开额外的维来表示一些特殊的情况,这样可以已分段为阶段向后推进,这种一般可以用于一种按照某种规则划分,使划分的段数最优的问题,也就是划分的段数未知时,并且这个不适于环形的,记忆化的话会出问题。。。
例子:
P1306 递增序列 P1322解题
◆封闭的划分或者选择
一般就是二维的方程表示把这一段已经划分完毕后的情况,以划分的的长度为阶段,比较适合于给定划分段数的划分问题,可以处理环,用记忆化会比较好些。。。转移时可以枚举划分的中心或者这一部分中划分为独立的一段的位置
例子:
P1100加分二叉树 P1118统计单词个数 P1218数字游戏 P1312能量项链
◆树形DP
很好很强大的Dp,一般依托树上的关系进行转移,并且因为依托关系比较严重,所以会开几维来记录情况,将每种情况分开处理。一般,如果不愿意多叉转二叉,可以用哪种求和以后进行枚举儿子进行替换
例子
P1144小胖守皇宫 P1395HYH的逻辑电路
◆背包问题
背包是个很好很强大的东西,各种例子,应用太多了。。。包括分组背包,判定性背包,将诡异的东西作为物品什么的。。。例子:
P1025小飞侠游园方案 P1104采药 P1117数的划分 P1133装箱问题 P1198最佳课题选择 P1313今明的预算方案 P1317开心的今明 P1334NASA的食物计划 P1407古韵之刺绣
◆图上的DP
图上的DP一般都会有某种限制来形成阶段和无后效性,比如阶段图,方向限制,权值(编号)限制,时间线限制,找到这个阶段就好搞了,最好进行记忆化搜索
例子:P1011清帝疑惑之顺治 P1364吃吃吃 P1370采果子 P1474雷曼兔
◆多进程DP 多方向Dp
这些都是比较奇怪的类型,比如旅行商简化版,HILL,三取方格数。。。不具体说了
◆双位选择问题:
类似最长公共子序列那种的,有两种两种位置共同构成状态,然后根据限制条件,选择两边,或者放弃某一边
一些例子:
P1327回文词 P1378矩阵取数游戏
◆包含性的可行性DP
V囧上比较少,但是如果想不到最优性的DP,可以想这种可行性的。。。
◆◆注意的问题
多个小Dp组成,比如矩阵取数游戏,统计单词个数,合唱队形之类的,就是不同次的DP没有关系,但是总起来就解决问题了。
空间问题:考虑可不可以使用滚动数组,但那时滚动数组如果正推要考虑每次都进行初始化
数据范围:看清楚是否需要高精,另外如果用int64那么中间的变量也需要用int64
赋初始值:有时注意赋值为maxlongint时,注意是不是会不够大,中间过程会不会两个相加爆掉。。。
环形DP--处理环:处理环有好几种情况,比如依赖于划分的,主要问题就是划分点可能正好位于环的两端相连的的地方,所以一般的做法是拷贝环,然后枚举每个起始点,记忆化搜索,比如数字游戏,能量项链。另一种就是可能就是相邻的决策有限制条件,这样可以单独处理一下边界位置就行了,比如说1470后花园。
输出方案:状态转移的时候顺便记录,至于字典序的问题,不一定在每次DP的时候选择一个字典序比较靠前的,要想清楚,最好都记下来然后深搜或者用字符串排