DP入门篇

来源:互联网 发布:薛之谦淘宝店dangerous 编辑:程序博客网 时间:2024/05/14 15:04

DP(Dynamic Programming)中文即称动态规划,据说是在造原子弹的时候发明出来的(陈计说的,本人对此不表示负责- -!)。

DP最主要的动机是存储中间状态,减少甚至避免重复计算。

主要实现方法:

 1.数组递推

   适用于状态顺序明确,层次清晰的模型,用几个for循环即可实现。

 2.记忆化搜索(备忘录)

   相对于上一种中如果递推顺序不明显的话可以用记忆化搜索,即用一个全局变量数组,保存搜索过程中计算到的值,下一次再搜索到这个状态的时候可以直接返回结果。

一般解题步骤:

1.设计状态

  设计状态必须满足两个特性:

   1.最优子结构

       局部最优能导致全局最优。

   2.无后效性

       这个最优解一旦确定就不会改变,就后面出现的状态不会使该状态更优,就后面出现的状态不会影响到前面的状态,最直观的意思就是层次分明,有阶段性。

2.设计状态转移方程

   当状态转移方程写不出来的时候就又要回过头去看状态设计有没有问题,一般解决方法是增加状态的维数,参见院赛(恶魔猎手的冒险)。

3.优化时间空间等

   当时间空间要求较高的时候就要进行优化了。

   时间优化:

      1.用高级数据结构协助(如线段树等)

      2.降低状态维度

      3.根据单调性,如四边形不等式优化,单调队列优化等

      4.看是否有贪心性质,对某个转移是否可以直接贪心得到

  空间优化:

      1.滚动数组(第n层状态只跟前一层状态有关,前n-2层状态都没必要保存)

常见模型:

1.背包(参见背包9讲)

   1.1 01背包(参见院赛第一题)

   1.2 无限背包

   1.3 多重背包等等

2.最长不下降子序列

      O(n^2)   O(nlogn) 两种,其中O(nlogn)就利用了单调性,额外维护一个数组并二分查找

3.最长公共子序列

最后推荐一个网址:http://www.isuanfa.cn/thread.php?fid=15

 

原创粉丝点击