一些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]=min(f[j])+a[i],j 有限制条件。本来这样的题是O(n2) 复杂度,但是使用优先队列就可以降为O(n) 了。
但是这样的方程呢:f[i]=min(f[j]+(a[i]a[j])2) 哦豁优先队列不得行了。
斜率优化是优先队列的优化。
设我们选择jk 时优,即有: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])<2a[i] ,此处注ai 要单增。
令两个点j(a[j],f[j]+a[j]) ,k(a[k],f[k]+a[k]) 显然不等式左边的几何意义为点j 与点k 的斜率,而j优于k的条件为斜率小于2a[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,mid][mid+1,r] 两个区间求解,然后在合并答案时考虑他们对答案多余的贡献,进而求解出[l,r] 的答案。
dp中的优化大概是区间dp的优化吧:大概可以把O(n2) 降为O(nlog2n) 没看到例题呢。

习题:

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

Orz—-终于写完了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章