做了这一个月的dp,对dp有了一点点感悟接下来写一写,
从oj来说这个专题的难度不一有很简单的求个状态转移方程的
比较水,几分钟就能做一道,也有很难的分部背包之类要理解几天的
题的。。
从算法本身来说,其实一开始对他的定义并没有多少了解,一开始一直纠结有些很简单的可以贪心算法解决的问题为什么要故意复杂化可是后来才知道不是复杂化了而是抽象的角度不同看待问题站的角度不同有些基本的问题上二者差别不是很大可是贪心本状态是来自于上一个状态so他能解决一些更加动态更加复杂的问题,而贪心是找局部最优按照一种方法从底层找,但是最优的最优不一定是最优是他最大的短板。
能采用动态规划求解的问题的一般要具有3个性质:
(1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
(2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。
(3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)
确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
关于dp的问题主要有数塔,简单的数列(水题),背包问题,上升子串,等等,但是解决的关键主要就是找状态转移方程,如何找哪,个人比较喜欢沿着dp定义来把问题细化
从小的入手然后找两个状态直接的关系~例如高中求数列,真心感觉思想上老像了。其他的不写了具体的一类问题找课件~课件模板老好使了。。