线性
有没有发现线性dp的状态表示总是有共同的特点?
关键词:前i个,第i个
或许还有一维状态,大概根据题目而异,比如说,选了几个,做了几次等等。
[NOIP2000]乘积最大
基础的dp。状态的表示非常常用。
[NOIP2008]传球游戏
同样是线性dp的基本状态表示。这道题还有一个技巧,就是将头和尾连接起来。
坐标
[NOIP2008]传纸条
坐标型dp非常经典的问题,大家都做过叭。。。
区间
此类问题通常时间复杂度是O(n^3)的,因为要枚举区间以及断点。
将环展成直线也是区间dp的常用套路。
noiw数据包的调度机制
栈的性质:枚举最后一个出栈的,将区间分成两半。
[NOIP2006]能量项链
简单的区间dp问题。
[NOIP2003]数字游戏
这道题除了区间还多了一维状态啊。。。
背包
一、0/1背包:循环顺序第二层从大到小。
二、完全背包:循环顺序第二层从小到大。
三、背包的可行性判断
[NOIP2001]装箱问题
裸题= =
四、分组背包
在每一组里做01背包。。
我也不知道是什么dp
一、递推有规律
有一些可以证明,但大多打表可知。。。
二、两种选择
垃圾陷阱
对于一个垃圾,要么吃,要么堆,一个存活时间一个高度。一般来说表示一个求一个。
[NOIP2007]守望者的逃离
每一秒可以正常走,可以用魔法值走,可以原地休息。不过还有魔法值这个量个控制。这样的话可以先求出来都用魔法值可以走多远,然后再判断是用魔法值还是正常走。
这道题告诉我们dp也是可以分开考虑的。
三、数学相关
[NOIP2001]数的划分
关键是状态不重不漏。
dp和其它算法的结合
邮票问题
dfs+dp
[NOIP2010]引水入城
bfs+dp
经典问题
一、线段覆盖问题
1、给出一些线段,从中去掉尽量少的线段使剩下的没有交集。
类似于贪心的思路,按照右端点从小到大排序。易知第一条线段一定会选,每一次贪心地选一个离已经覆盖的区域最近的线段。
2、给出一些线段,每个线段有一个价值,选出一些线段没有交集且价值最大。
同样按照右端点从小到大排序。设f(i)表示前i条线段选出一些的最大价值。显然f(i)是不降的。那么每一次需要找到左边和当前没有交集的最靠右的一条线段来更新。可以用二分来优化。
3、给出一些线段,从中去掉尽量多的线段使剩下的完全覆盖。
同样也是贪心。首先按照线段的左端点排序,第一条线段是一定会选的,然后从左向右扫,选出当前选出的线段能覆盖到的、右端点延伸最多的线段。