由于被叫到要分享算法,这里瞎总结下我一些做题经验,想到啥讲啥
以下针对,常见一维,DAG图上DP瞎讲
DP数组
感觉常见数组含义都是,前 i i i 个选 j j j 个,第 i i i 个选不选等,DAG图上也可以类似对应。
普通一维, D P [ i ] [ j ] = ? DP[i][j]=? DP[i][j]=? 左边含义如此,当然也可以扩展维度,成为三维等。
dp等式右边本人常见的有,极值,方案数,能否转移(方案数 > = 1 >=1 >=1)。
一些其他的限制通常加在等式左边(如第k大啥的),或转移时增加条件。
转移方程
我感觉的常见转移
从某个位置转移而来,for一遍位置(有些可以用斜率四边形等操作优化决策集,使枚举位置这层复杂度变成均摊 O ( 1 ) O(1) O(1) )
从上个状态转移而来,形如 D P [ i ] [ j ] = D P [ i ] [ j − 1 ] + ? DP[i][j] = DP[i][j-1]+? DP[i][j]=DP[i][j−1]+? 这种,这种通常能用滚动数组优化。
PS. 有些题目,可能要经过排序后才可能能够DP,这种可能比较难看出。
DAG图上DP
我了解的就只有(菜)拓扑排序,或者树形DP
因为图是无环的,满足DP的无后效性,正确性比较显然?写起来难想。
拓扑排序感觉就跟一维的没什么区别
树形常见 d p [ i ] [ j ] dp[i][j] dp[i][j] 以i为根节点第j大,也可以跟拓扑类似,树形没刷几题orz。
随便方几道例题
NOIP 2000 乘积最大 ———— 前i个选j个
POJ 3249 Test for Job ———— 拓扑排序DP,可以衍生下只能选m个节点之类
HRBUST 2319——Number Game ———— 排序,前i个选j个
CF 1152 D.Neko and Aki’s Prank ———— 前i个选j个,方案数
HDU 2196 Computer 树形DP
CF 633 F. The Chocolate Spree 树形DP