动态规划
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 类型的题目
递推找公示的题目