• 最长递增子序列


    给出长度为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;
     }


            

  • 相关阅读:
    取近似值
    eclipse 自己主动为getter和setter加入中文凝视
    Linux对外连接port数限制
    C++链表冒泡,归并,插入排序(纯指针)
    Android之实现ViewPager+Fragment左右滑动
    获得鼠标离开消息。
    CMFCPropertyGridProperty的使用
    阅读书单
    Docker 容器管理
    docker rmi 详解
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746081.html
Copyright © 2020-2023  润新知