一些dp技巧

才不告诉你这些学校没讲呢!
都是些算法的简单思想简单总结,大佬勿入(嗯,dp开始涉及几何了)

数位dp:

有的题要求的是一个数中的数字的排列的方式的种数,而并非与数本身有关系。它常常会给你一个区间 [ l , r ] 询问其中有多少个满足题意的数字,这时就要用数位dp。它是一种记忆化搜索,它的状态常常是 f [ i ] 前i位满足题意的数字个数。同时要注意控制上界。答案就是ans(r)-ans(l-1)。

习题

基础:HDU 2089 HDU 4734 POJ 3252 HDU 4507
水水水题:HDU 3709 UVA 1305 Hbzoj 1799

相关大佬博客链接

斜率优化:

通常有这样的问题: f [ i ] = m i n ( f [ j ] ) + a [ i ] , j 有限制条件。本来这样的题是 O ( n 2 ) 复杂度,但是使用优先队列就可以降为 O ( n ) 了。
但是这样的方程呢: f [ i ] = m i n ( f [ j ] + ( a [ i ] a [ j ] ) 2 ) 哦豁优先队列不得行了。
斜率优化是优先队列的优化。
设我们选择 j k 时优,即有: f [ j ] + ( a [ i ] a [ j ] ) 2 < f [ k ] + ( a [ i ] a [ k ] ) 2
变形,得: ( ( f [ j ] + a [ j ] ) ( f [ k ] + a [ k ] ) ) / ( a [ j ] a [ k ] ) < 2 a [ i ]
令两个点 j ( a [ j ] , f [ j ] + a [ j ] ) , k ( a [ k ] , f [ k ] + a [ k ] ) 显然不等式左边的几何意义为点 j 与点 k 的斜率,而j优于k的条件为斜率小于 2 a [ i ] ,即斜率越小越好。
然后再用优先队列维护一个点集,队列中相邻两点的斜率单增(斜率越小越好),然后每次根据上面的不等式维护队首即可。时间复杂度这时被降为了 O ( n )

习题

懒得打链接的博猪推荐:
[hdu3507] 打印文章(引例)
[HNOI2008] 玩具装箱
[CEOI2004] 锯木厂选址
[ZJOI2007] 仓库建设
[USACO 2008 March Gold] 土地购买
[APIO2010] 特别行动队
[APIO2014] 序列分割
[bzoj3437] 小P的牧场
[SDOI2016] 征途

相关大佬博客链接

决策单调性优化:

没看懂,以后再更。四边形不等式撒子鬼玄学嘛!!!!反正用个结论,然后降复杂度呀!

习题不会做呀

BZOJ1563: [NOI2009]诗人小G
BZOJ5311: 贞鱼
相关大佬博客链接

CDQ分治优化:

CDQ分治本身思想是:把一个求解的区间 [ l , r ] 分为 [ l , m i d ] [ m i d + 1 , r ] 两个区间求解,然后在合并答案时考虑他们对答案多余的贡献,进而求解出 [ l , r ] 的答案。
dp中的优化大概是区间dp的优化吧:大概可以把 O ( n 2 ) 降为 O ( n l o g 2 n ) 没看到例题呢。

习题:

bzoj 2253: [2010 Beijing wc]纸箱堆叠
bzoj1492

Orz—-终于写完了。

猜你喜欢

转载自blog.csdn.net/qq_42013837/article/details/81149926