问题:一个序列有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)); } }