每日算法-05(最长上升子序列)

求最长上升子序列

第一行输入一个数n,接下来一行,输入n个数值,求最长上升子序列;

输入例子:

5

2 1 8 3 6

输出:

3

解析:1 3 6

赶脚这个代码还是很菜,先上菜吧,开个胃,哈哈哈;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int i=0,j=0;
		int dp[]=new int[n+1];int aa[]=new int [n+1];
		for(i=0;i<n;i++)
		{
			aa[i]=in.nextInt();
		}
		int ans=0;
		for(i=0;i<aa.length;i++)
		{
			dp[i]=1;
			for(j=0;j<i;j++)
			{
				if(aa[j]<aa[i])
				{
					dp[i]=Math.max(dp[j]+1,dp[i]);
				}
			}
			ans=Math.max(ans,dp[i]);
		}
		System.out.print(ans);
		return;
	}

}

仅自己这样想的,不包含科学质上对哈,有错欢迎提出。?

原文地址:https://www.cnblogs.com/lwyy1223-/p/12680044.html

时间: 2024-08-06 17:37:39

每日算法-05(最长上升子序列)的相关文章

算法学习 - 最长公共子序列(LCS)C++实现

最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, 动态规划 这里为什么要使用动态规划可以说一下,简单来说动态规划是为了降低时间复杂度的一种算法,申请一个额外空间,来保存每一个步骤的结果,最后从这些结果中找到最优的解. 这里有个问题就是:一般来说,当前的最优解,只与当前时刻和上一时刻有关系,和其他时刻没有关系,这样才能让动态规划发生作用,降低复杂度

O(nlogn)算法,最长上升子序列,,非动规

//最长上升子序列最快算法,非动态规划,运用了二分思想,还有栈的思想, //用每一个数去和栈中的栈顶元素相比较,如果大于栈顶元素,则入栈,否则运用二分查找,寻找出第一个比这个数大的那个数替换 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> using namespace

动态规划算法3——最长上升子序列

今天我们要讲的是最长上升子序列(LIS). [题目描述] 给定N个数,求这N个数的最长上升子序列的长度. [样例输入] 7 2 5 3 4 1 7 6 [样例输出] 4 什么是最长上升子序列? 就是给你一个序列,请你在其中求出一段不断严格上升的部分,它不一定要连续. 就像这样:2,3,4,7和2,3,4,6就是序列2 5 3 4 1 7 6的两种选取方案.最长的长度是4. 那么,怎么求出它的最大上升子序列长度为4呢?这里介绍两种方法,都是以动态规划为基础的. 首先,我们先介绍较慢(O($n^2$

ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序列的要求满足其中字符的顺序和字母在两个序列中都必须相同,任意输出一个符合题意的子序列 首先是最基本的最长公共子序列的状态转移问题: 这里的maxLen[i][j]数组的意思就是保存s1的前 i 个字符和s2的前 j 个字符匹配的状态. 举个例子:maxLen[3][6]即表明在s1的前3个字符和s2

【算法】最长公共子序列(nlogn)

转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 最长公共子序列(LCS)最常见的算法是时间复杂度为O(n^2)的动态规划(DP)算法,但在James W. Hunt和Thomas G. Szymansky 的论文"A Fast Algorithm for Computing Longest Common Subsequence"中,给出了O(nlogn)下限的一种算法. 定理:设序列A长度为n,{A(i)},序列B长

动态规划算法解最长公共子序列LCS问题

第一部分.什么是动态规划算法 ok,咱们先来了解下什么是动态规划算法. 动态规划一般也只能应用于有最优子结构的问题.最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似).简单地说,问题能够分解成子问题来解决. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础. 由计算出的结果构造一个最优解.   //此步如果只要求计算最优解的值时,可省略. 好,接下来,咱们

字符串算法之最长公共子序列

最长公共子序列,即 longest common subsequence,LCS.一个字符串删掉任意字符后所形成的字符串,不要求连续,注意和最长公共子串的区别. LCS的应用:论文查重,图形相似度比较,基因序列比较等. 暴力求解: 分别求出X.Y串的子序列,而后进行搜索比较,容易得到该算法复杂度为O(2^m · 2^n ),显然不可取 动态规划: 设有两个字符串X[1....m],Y[1....n],求其最长公共子串 假设Xi Yi为两个字符串从1开始数的第i个字符,若xm=yn,则xm必在最长

算法实践--最长递增子序列(Longest Increasing Subsquence)

什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5}, {1} 其中最长的递增子序列是{2, 4, 5} 问题:对于长度为N的矢量D,如何找到它的最长递增子序列 一个简单的算法 for (i=N; i>0; --i) {1. 找到所有长度为i的子序列; //复杂度为(N!)/(i!)(N-i)! O(exp(N)) 2. 判断是否其中有一个为递增子

(算法)最长递增子序列

问题: Given an array of N integer, find the length of the longest increasing subsequence. For example, given [1,-5,4,5,10,-1,-5,7], the longest increasing subsequence is length 4.(1,4,510) 思路: 1.枚举 枚举数组所有的子序列,然后判断它们是否为递增子序列(回溯法). 2.转化 将数组排序,然后找出新数组和旧数组