动态规划 最长子序列

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划 最长子序列相关的知识,希望对你有一定的参考价值。

 有关概念:

  最长上升子序列(LIS,Longest Increasing Subsequence),在一个序列中最长的单调递增的子序列

例子:

输入:

2 1 5 3 6 4 8 9 7

输出:

5

(1)第一种解法:

  fi表示以第i个数结尾的LIS长度

  对于序列中的一个数i,在i前面枚举数j,j满足比i小且fj最大,将i作为j的后继

  伪代码&状态转移方程:

  f1=1

  for i=2...n

    for j=1...i-1

      if(aj<ai)fi=max(fi,fj+1)

  最后结果在f1~fn中取最大值

  当然,可以在更新fi的时候顺便记录j的位置,在最后可以输出整个LIS

private static int sequence(int[] array, int n) {
		if (n == 0) {
			return 0;
		}
		int[] maxLen = new int[n];
		// 初始化数组元素值
		for (int i = 0; i < n; i++) {
			maxLen[i] = 1;
		}
		for (int i = 1; i < n; i++) {
			for (int j = 0; j < i; j++) {
				if (array[j] < array[i]) {
					// 解最大值,有多条路径
					maxLen[i] = Math.max(maxLen[i], maxLen[j] + 1);
				}
			}
		}
		// 数组升序
		Arrays.sort(maxLen);
		// 数组最大值
		return maxLen[n - 1];
	}

  

 时间复杂度为o(n^2);

 

第二种:详情见该博文;http://www.cnblogs.com/ziyi--caolu/p/3227121.html

 

以上是关于动态规划 最长子序列的主要内容,如果未能解决你的问题,请参考以下文章

关于用动态规划法求最大公共子序列的问题

JAVA动态规划,最长递增子序列的代码太难理解,求大神帮我讲解一下!

动态规划 最长公共子序列 过程图解

算法导论—最长公共子序列(动态规划)

单调递增最长子序列(动态规划)

动态规划 最长子序列