POJ 3903

http://poj.org/problem?id=3903

这个题目是一个求最长递增子序列,这个只是求长度而已,所以可以用LIS

所谓的LIS也就是用二分优化来减少时间而已,而且其只能求出最长的序列,但其所包含的并不是最长的序列

#include <iostream>
#include <stdio.h>

using namespace std;

int a[100005],dp[100005];

int main()
{
    int n;
    while(scanf("%d",&n)>0)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        dp[0]=a[0];
        int len=1;
        for(int i=1;i<n;i++)
        {
            int left=0,right=len-1,mid;
            if(a[i]>dp[len-1])
                dp[len++]=a[i];
            else{
                right=len-1;
                while(left<=right)
                {

                    mid=(left+right)/2;
                    if(dp[mid]<a[i]) left=mid+1;
                    else right=mid-1;
                }
                dp[left]=a[i];
            }
        }
        printf("%d\n",len);
    }
    return 0;
}
时间: 2024-11-25 12:36:40

POJ 3903的相关文章

poj 3903 &amp; poj 2533 最长上升子序列(LIS)

最长上升子序列. 做这道题之前先做了2533,再看这道题,感觉两道题就一模一样,于是用2533的代码直接交, TLE了: 回头一看,数据范围.2533 N:0~1000:3903 N :1~100000. 原因终归于算法时间复杂度. 也借这道题学习了nlgn的最长上升子序列.(学习链接:http://blog.csdn.net/dangwenliang/article/details/5728363) 下面简单介绍n^2 和 nlgn 的两种算法. n^2: 主要思想:DP: 假设A1,A2..

LIS(nlogn) POJ 3903 Stock Exchange

题目传送门 1 /* 2 最长递增子序列O(nlogn)算法: 3 设当前最长递增子序列为len,考虑元素a[i]; 4 若d[len]<a[i],则len++,并将d[len]=a[i]; 5 否则,在d[1~len]中二分查找,找到第一个比它小的元素d[j],并d[j]=a[i]. 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #include <iostream> 10 #include <algori

{POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}

题意:求最长上升子序列,n=100000 思路:O(N^2)铁定超时啊....利用贪心的思想去找答案.利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的.这个题目确实不错,思路很好 #include <iostream> #include <string> #include <cstring> #include <cstdio> #include <algorithm> #include <memory>

poj 3903 Stock Exchange(最长上升子序列,模版题)

题目 #include<stdio.h> //最长上升子序列 nlogn //入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现 //数组下标从1号开始. int bsearch(int a[],int len,int num) { int left=1,right=len; while(left<=right) { int mid=(left+right)/2; if(num<=a[mid]) //若最长不下降子序列,改<= 为 < right=m

POJ 3903 Stock Exchange LIS

题目链接:http://poj.org/problem?id=3903 题目大意:LIS的nlog(n)写法. 解题思路:dp[i]:=长度为i的最长递增子序列的末尾元素最小值.那么由于dp[i]形成了一个有序的序列,所以可以采用二分的办法. dp[j] = a[i]  dp[j] <= a[j] < dp[j + 1] 代码: 1 const int inf = 0x3f3f3f3f; 2 const int maxn = 1e5 + 5; 3 int a[maxn], n; 4 int d

POJ 3903:Stock Exchange(裸LIS + 二分优化)

http://poj.org/problem?id=3903 Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5983   Accepted: 2096 Description The world financial crisis is quite a subject. Some people are more relaxed while others are quite anxious. J

poj 3903(最长上升子序列 )

题目链接:http://poj.org/problem?id=3903 Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4263   Accepted: 1523 Description The world financial crisis is quite a subject. Some people are more relaxed while others are quite anxio

POJ 3903 Stock Exchange (LIS:最长上升子序列)

POJ 3903Stock Exchange (LIS:最长上升子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=100000) 的数字序列, 要你求该序列中的最长(严格)上升子序列的长度. 分析: 由于n的规模达到10W, 所以只能用O(nlogn)的算法求. 令g[i]==x表示当前遍历到的长度为i的所有最长上升子序列中的最小序列末尾值为x.(如果到目前为止, 根本不存在长i的上升序列, 那么x==INF无穷大) 假设当前遍历到了第j个

POJ 3903 Stock Exchange 【最长上升子序列】模板题

题目链接:http://poj.org/problem?id=3903 转载于:https://www.cnblogs.com/GodA/p/5180560.html 题目大意: 裸的DP最长上升子序列,给你一段序列,求其最长上升子序列的长度,n^2的dp朴素算法过不了,这里用的是nlogn的算法,用了二分查找. 具体算法思路解析: 学习动态规划问题(DP问题)中,其中有一个知识点叫最长上升子序列(longest  increasing subsequence),也可以叫最长非降序子序列,简称L