dp记录。

0.dp

dp的本质上是在一个有向无环图上做拓扑,当前状态不会受后续结果的影响,因此设计状态是这很重要的一点

 考虑转移方程 ,可以从当前这个点,可以从哪些点走过来,或者说当前这个点可以走到哪些点。

1.线性dp

一维状态   枚举以什么结尾,最后一个数字是什么等等 

二维可以枚举其他需要的性质

利用 i % 2 和 i - 1 % 2  实现滚动数组,可以不需要设置外置的数组

同时写答案的时候也得 n % 2

如果观察到字母比较有限,可以考虑从字母  26  

2.背包dp

背包有几个状态就考虑开几维数组

背包中求方案数,和价值有细微的区别,求价值是求最大值,而方案数是求总和,因此,方案数的转移只需要将所有前置的情况加在一起就行了

背包问题用来解决求子集问题 如  1  2  4  7

求可以达到的价值和

3.树形dp

设计对树形dp递归的临近状态,如果以图的方式存储那就按拓扑序进行

如果是left right 访问二叉树,当left == right  访问到了叶节点

 4.状压dp

状压dp有俩种,一种是带有显明的“层数”转移,俩种状态之间存在唯一的转移情况,往往是线性的状压dp,另一种是是类似枚举状态,通过各种的预处理,实现目前状态的最优解。

 图上状压是真的挺难的题 , 通过枚举图上一些特殊点,来实现转移 ,有种bfs的思想在里面,只不过队列中的元素变成了状态

5.期望dp

 期望dp 其实更像是一些数学问题,首先得知道一个 E(ax + by) =  a*E(x) + b * E(y)

左边是转移目表,右边是已知状态

期望dp要从已知的状态 向未知的状态转移,讲起来好像有点抽象

举个例子,求从起点到终点的期望,但你初始知道的是终点到终点的期望为0,所以你应该从终点开始反向转移,

做了很多题,发现到头了还是数学思维比较重要

6.数位dp

数位dp  其实很想是一个数位上的记忆化搜索,对于这些题,其实都有一定的套路

如果是多次数位dp,你可以观察哪些量需要重置 , limit  这个限制多半是要重置的,但lead0等等性质其实都不需要重置,因为他填的是数位,并非具体的数字

你可能感兴趣的:(dp,c++)