参考文献:全国青少年信息学竞赛培训教材——复赛(陈合力 游光辉 编著)
一、概念
在多阶段决策的问题中,各阶段采取的决策,一般俩说是与空间或者时间相关的。决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来,故有动态的含义。
我们称这种解决多阶段决策最优化的过程称为动态规划方法。
例如在一个m*n的迷宫中,从左下角走到右上角
可以看到,状态A和状态B应当属于同一个阶段。T可以从A走来,也可以从B走来,故dp[T]=min(dp[A]+map[A][T],dp[B]+map[B][T]);即终点的最短路应当是A或者B的最短路+最后一段长度.
动态规划的几个术语:
阶段:把所求问题的过程按照时间或者空间恰当地划分成若干个相互联系的阶段。
状态:表示每个阶段的客观状态,它既是每个阶段的出发位置,又是前一阶段的终点。
无后效性:如果给定某一阶段的状态,则在这一阶段以后的过程发展不受这个阶段以前的各个状态的影响,所以各阶段确定了,整个过程也就确定了。
决策:一个阶段的状态给定之后,从该状态演变到下一状态的一种选择。
策略:每个阶段决策组成的序列。
最优性原理:把一个大问题划分成多个子问题,对于整个问题必须最优的情况时,子问题也必须最优,即问题具备最优子结构的性质。
二、线性动态规划
线性动态规划中状态是一维的,第i个元素的状态与前i-1个元素的状态有关,前i-1个状态组成一个决策序列,它是其他类动态规划的基础。
最长不下降子序列
Given an unsorted array of integers, find the length of longest
increasing subsequence.For example, Given [10, 9, 2, 5, 3, 7, 101, 18], The longest
increasing subsequence is [2, 3, 7, 101], therefore the length is 4.
Note that there may be more than one LIS combination, it is only
necessary for you to return the length.
我们用dp[i]表示序列长度为i的时候最长不下降子序列的长度。
当序列长度为i时,dp[i]=max{d[j]}+1(0<=j
class Solution {
public: