算法之DP

Posted greed-vi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之DP相关的知识,希望对你有一定的参考价值。

一般DP

都是有模板的,先初始化,然后找到不同状态下数值的关系,使得某个状态可用另一个状态由一个固定的方式转移而来,列出状态转移方程,这就是DP;

例题

P1216 [USACO1.5]数字三角形 Number Triangles

技术分享图片
1 f[i][j]+=max(f[i-1][j-1],f[i-1][j]);
方程

P1044 栈

技术分享图片
1 f[i]+=f[j]*f[i-j-1];
方程

P2800 又上锁妖塔

技术分享图片
1 f[i]=min(f[i-1]+t[i],min(f[i-2]+t[i-1],f[i-3]+t[i-2]));
方程

P1057 传球游戏

可以看出,裸的DP是几乎没有难度的,当然某些题除外如P1004P1280等题,值得思考。

背包问题

背包属于基础DP,但拓展性是最高的。

具体可以看dd大牛的《背包九讲》

1 f[v]=max{f[v],f[v-c[i]]+w[i]}; 

上面的是01背包的转移方程,但v是从V...c[i]的。

为什么呢?这个方程代表第v个体积的物体的最大值=max(他自己本身,v-第i个物体的体积时的最大值+第i个物体的值)

例题

01背包基本是套这个模板,但也不缺乏很有思考性的,如P2370P2979P1156P4544(这个要单调队列优化,但纯背包有60-70分,题解在这里);

线段树单调队列优化

 

优先队列优化

 

状压DP(就是变相暴力)

 

树形DP(我最不擅长)

 

二分优化

 

还有一些提高组的就不列了(如斜率优化,数位,插头DP)

以上是关于算法之DP的主要内容,如果未能解决你的问题,请参考以下文章

朝题夕解——DP之印章

蓝桥杯之算法模板题 Python版

dp算法之方格取数

转载+删改:算法讲解之Dynamic Programing —— 区间DP [变形:环形DP]

由Leetcode详解算法 之 动态规划(DP)

RMQ问题之ST算法