动态规划

http://doc.okbase.net/cc_again/archive/71796.html 

 

 

一 . 定义

  1 . 动态规划是运筹学中用于求解决策过程中最优化数学方法 。

  2 . 如果问题是交叠的子问题构成 , 我们就可以用动态规划来解决它 。

 

动态规划的思想是什么:记忆,空间换时间,不重复求解,由交叠子问题从较小问题解逐步决策,构造较大问题的解。

 

动归解决问题的一般思路 :

  1 . 将原问题分解成若干的子问题 。

    由于子问题 与 原问题规模相同或相似 , 所以当子问题解决时 , 原问题也就相当于解决 。

    子问题的解一旦求出就会被保存 , 所以所有的子问题都只被求了一次 。

  2 . 确定状态

    和子问题相关的各个变量的一组取值 , 称之为一组 “状态” , 一个 “状态” 对应一个或多个子问题 , 所谓某个 “状态” 下的值 , 就是这个 “ 状态” 所对应子问题的解 。

    所有状态的集合 ,构成问题的 “状态空间 ” , “状态空间” 的大小 与解决问题的时间复杂度有关 。

  3 . 确定状态转移方程

    定义出什么是 “状态” , 以及在该状态下的“值” ,就要找出不同状态之间是如何迁移的 ,即如何从一个或多个“值”已知的 “状态” , 求出另一个 “状态” 的 “值”  (递推型) 。

    状态的迁移可以用递推公示表示 , 此递推公示也叫做 “状态转移方程” 。

 

举例 ( 数字三角形的状态转移方程 ) :

 

 Maxsum[ i ][ j ] = {  pre[ i ] [ j ]          i == n ;

               max ( Maxsum[i+1][ j ] , Maxsum[ i + 1 ] [ j + 1 ] ) + pre[ i ] [ j ] ;     其它的情况

  

能用动态规划解决问题的特点 :

  1 . 具有最优子结构特点 。 如果问题的最优解所包含的子问题的解也是最优的 , 我们就称该问题具有最优子结构性质 。

  2 . 无后效性 。 当前的若干状态值一旦确定 , 则此后过程的演变 , 只和这若干个状态的值有关 , 和之前采取何种手段 走哪条路径演变到当前的若干个状态 , 没有关系 。

 

 二 . 分类

   1、简单基础dp

   主要包括递推、背包、LIS(最长递增序列),LCS(最长公共子序列),下面针对这几种类型,推荐一下比较好的学习资料和题目。

     1、递推:

 

     递推一般形式比较单一,从前往后,分类枚举就行。

       简单 :   HDU 2084 数塔    /       POJ  1163 数字三角形

           Fibonacci  类型的题目

           递推找公示的题目

posted @ 2017-08-08 00:26  楼主好菜啊  阅读(263)  评论(0编辑  收藏  举报