zoukankan      html  css  js  c++  java
  • 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

    例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
     

    Input第1行:1个数N,N为序列的长度(2 <= N <= 50000) 

    第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= Sii <= 10^9)

    Output输出最长递增子序列的长度。

    Sample Input

    8
    5
    1
    6
    8
    2
    4
    5
    10

    Sample Output

    5

            思路:动态规划

            

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define INF 0x3f3f3f3f
    int a[50010],dp[50010];
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    		dp[i]=INF;
    	}
    	for(int i=0;i<n;i++)
    	{
    		*lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素,并用a[i]替换;
    	}
    	cout<<lower_bound(dp,dp+n,INF)-dp<<endl;//找到第一个INF的地址减去首地址就是最大子序列的长度;
    	return 0;
    } 

            当然还有一种dp,但是上面的时间为n*lgn(此题能够通过),下面的时间为n*n(此题不能通过),但是可以看一下,加深理解

            

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int a[10010];
    int dp[10010];
    int main()
    {
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    		dp[i]=1;
    	}
    	int ans=0;
    	for(int i=1;i<n;i++)
    	{
    		for(int j=0;j<i;j++)
    		{
    			if(a[j]<a[i])
    			{
    				dp[i]=max(dp[j]+1,dp[i]);
    			}
    		}
    		ans=max(ans,dp[i]);
    	}
    	cout<<ans<<endl;
    	return 0;
     }


            

  • 相关阅读:
    缓存穿透与缓存雪崩
    hibernate 用hql做中文排序
    设计一个算法,求非空二叉树中指定的第k层(k&gt;1)的叶子节点的个数
    CI框架源代码阅读笔记3 全局函数Common.php
    Linux安装中文man手冊
    ios 自己定义导航栏和切割线
    算法7-7:有向图简单介绍
    [Leetcode]-Min Stack
    ios28--UIScrollView
    ios27--kvo
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746081.html
Copyright © 2011-2022 走看看