动态规划,即dp,它可是算法竞赛的重中之重呀。dp不仅仅是一类题型,更是一种思维方式,将其融入在其他算法中会有意想不到的效果(比如floyd上跑dp等
dp大概划分为以下几类
- 简单的DAG上的动态规划
- 背包问题(cty的背包九讲
- lcs&lis等问题
- 区间dp (类似分治
- 概率&期望dp (重点还是对期望和概率的概念理解
- 树形dp(建图比较重要
- 思维量蛮高的数位dp(目前没做呜呜呜
这个专题就以后肯定要专项练习,现在并没有抓住dp的精髓,题目也是胡乱搞着A掉,以后再仔细研究吧。
xdoj上也有一道类似的题(1233,简化版),本以为仅仅是求最长公共子序列,忘了看数据范围结果T了,仔细读题后发现不是能力范围内的。看题解说用树状数组,然而当时并不理解树状数组。。
典型的区间dp问题,读入数据有点多。。dp[i][j]表示从第i头狼到第j头狼全部被杀死所受到的最小伤害。a[i]表示第i头狼的初始攻击力,b[i]表示第i头狼对相邻狼的加成值。
F - Hie with the Pie POJ - 3311
TSP问题。状压dp,先floyd计算最短路径,数据量小时(20左右),优先考虑状态压缩。
J - Card Collector HDU - 4336 非常nice的一道概率dp。用位进制0表示这个卡片有了,1表示这个卡片还没有,那么 例如 “3” 用二进制表示 “1 1” 那么 数组 dp[3] 记录的就是 1号卡片和2号卡片都有的情况集齐一套卡片需要的张数的数学期望。(转移的方程比较难推。
树形dp,,,,,,,然而当时用最小点覆盖过了。
总的来说,dp好难,简直太难了,不过越是这种思维上的东西越有魅力。