【前言】动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解。
动态规划则应用于子问题重叠的情况,通常用来求解最优化问题。这类问题可以有很多可行解,每个解都有一个值,我们希望寻找最优值的解。
通常有4个步骤来设计动态规划算法:
1.刻画一个最优解的结构特征。
2.递归地定义最优解的值。
3.计算最优解的值,通过采用自底向上的方法。
4.利用计算出的信息构造一个最优解。
【问题1】最长递增子序列问题
【问题描述】设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<ak1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
采用一个数组temp[]保存 以当前元素结尾的最长递增子序列长度,最后求出全局最优解
更新最长递增子序列的条件:a[i]>a[j] (i>j) 且前一个递增序列长度大于等于当前递增序列长度
//动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。
//最长递增子序列O(N^2)
public void longestIncreasingSubsequence2(int[] a){
int[] temp=new int[a.length];
temp[0]=1;
int max=0;
for(int i=1;i<a.length;i++){
temp[i]=1;
for(int j=0;j<i;j++){
if(a[i]>a[j]&&temp[i]<=temp[j]){//找出最大的temp[j](前一个最长递增子序列长度)temp[i]<=temp[j]
temp[i]=temp[j]+1;//更新最长递增子