动态规划 最长子序列

有关概念:

  最长上升子序列(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

时间: 2024-10-13 18:20:17

动态规划 最长子序列的相关文章

【动态规划】单调递增最长子序列

问题 D: [动态规划]单调递增最长子序列 时间限制: 1 Sec  内存限制: 128 MB提交: 36  解决: 25[提交][状态][讨论版] 题目描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 解题思

_____________________________________动态规划之最长子序列问题______1:两个序列中的______________________________________

动态规划之最长自序列问题....两个字符串中的最长子序列问题. 参考例题杭电1159.....参考文件.lcy老师的课件....在此对lcy老师致敬.. 最长子序列问题....... 下面附上题目 Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In Hand Online Acmers Forum | Discuss Statistical Charts Proble

nyist oj 17 单调递增最长子序列 (动态规划经典题)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 动态规划的经典题目:好像还有好几种解法,我现在研究的

NYOJ-17-单调递增最长子序列【动态规划】

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 上传者 iphxer #include<stdio

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

单调递增最长子序列 题目描述: 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入描述: 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出描述: 输出字符串的最长递增子序列的长度 样例输入: 3 aaa ababc abklmncdefg 样例输出: 1 3 7AC代码: 1 #include<stdio.h> 2 #include<string.h> 3

算法实验--最长子序列

一.实验目的: 熟悉掌握动态规划法设计技术 二.实验要求: 1.按教材所授内容要求,完成“最长公共子序列问题”算法.得到一个完整正确的程序. 2.问题规模:不少于100 3.输出最终结果. 三.实验设备: PC机一台 Vc++6.0编译软件一套 四.问题描述: 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij.例如,序列Z={B,C,D,B}是序列X={A

最长子序列问题 最详细的解题报告

最长子序列之和问题 算法一:暴力法(时间复杂度:O(N^2)) 算法描述:依次求从j到i中最大的和,并将最大的和记录在maxValue中,容易理解但是效率低. 1 static int MaxSum1(int[] arr) { 2 int maxValue = Integer.MIN_VALUE; 3 for (int i = 0; i < arr.length; i++) { 4 int curSum = 0; 5 for (int j = 0; j <= i; j++) { 6 curSu

Java 最长子序列和最长子串

最长子序列:匹配的字符不需要连续. 最长子串: 匹配的字符需要连续,可能有多种结果. 解决思路:将输入字符串1看作行, 输入字符串2看作列,构成二位数组,然后将对角线匹配字符的值标记为1,计算满足条件的匹配字符个数即可. 基本思想: 空间换时间,动态规划. 图解与公式(只针对最长子序列,最长子串类似) 状态转移方程 直观版: 最长子序列 1 /** 2 * find longest common sequence from two input string 3 * @param s1 4 * @

求单调递增最长子序列长度

设计O(n*n)时间的算法,求n个数组成的序列的单调递增最长子序列长度 这道题在算法分析课本中属于课后习题,许多人做过,这道题是我真正体会到动态规划的思想的一道题,下面给出一个简单的思路! 记a[i]表示输入的序列,b[i-1]表示以a[i]结尾的序列的单调递增最长子序列,则原问题的解为b[n-1]: 原文地址:https://www.cnblogs.com/zhanbeizhu/p/9899977.html