问题:一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度。
抽象:找出这N个数的最长非降子序列的长度。
思路:使用动态规划递推法,若d(i)为前i个数的最长非降子序列的长度,那么它依赖于d(1)...d(i-1)的长度,求出d(i),又可往后求出d(i+1)...n。其状态转移方程为:d(i) = max{1, d(j)+1},其中j=1...i-1,A[j]<=A[i]。
代码如下:
package test;
/**
* 动态规划求最长非降子序列问题
* @author yanghang
*
*/
public class Dongtaiguihua {
/**
* longest increasing subsequence
* @param a
* @return
*/
public static int lis(int[] a) {
// 统计当前阶段的最长非降子序列
int len = 0;
// 原始数列长度
int n = a.length;
// 当前状态
int[] d = new int[n];
for (int i = 0; i < n; i++) {
d[i] = 1;
for (int j = 0; j < i; j++) {
//状态转移方程的实现
if (a[j] <= a[i] && d[j] + 1 > d[i]) {
d[i] = d[j] + 1;
}
}
if (d[i] > len) {
len = d[i] ;
}
}
return len;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 5, 3, 4, 8, 6, 7 };
System.out.println(lis(a));
}
}