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

Posted is_ok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3903 Stock Exchange 最长上升子序列模板题相关的知识,希望对你有一定的参考价值。

<题目链接>

题目大意:

裸的DP最长上升子序列,给你一段序列,求其最长上升子序列的长度,n^2的dp朴素算法过不了,这里用的是nlogn的算法,用了二分查找。

O(nlogn)算法

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N= 1e5+5;
int a[N],rise[N];

int main(){
    int n;while(~scanf("%d",&n)){
        memset(rise,0,sizeof(rise));
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        int len=0;
        rise[0]=-1e9;
        for(int i=0;i<n;i++){
            if(a[i]>rise[len])rise[++len]=a[i];
            else{
                int j=lower_bound(rise+1,rise+1+len,a[i])-rise;
                rise[j]=a[i];
            }
        }
        printf("%d\\n",len);
    }
}

 

 

虽然(n^2)算法过不了此题,但是还是放一下

 

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int n,dp[N],a[N];
//dp[i]表示以第i个元素为结尾的最长上升子序列长度

int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        dp[0]=1;
        for(int i=1;i<n;i++){
            dp[i]=1;
            for(int j=0;j<i;j++){
                if(a[j]<a[i] && dp[i]<dp[j]+1 ) dp[i]=dp[j]+1;
            }
        }
        int mx=-1e9;
        for(int i=0;i<n;i++) mx=max(mx,dp[i]);
        printf("%d\\n",mx);
    }
}

 

以上是关于POJ 3903 Stock Exchange 最长上升子序列模板题的主要内容,如果未能解决你的问题,请参考以下文章

POJ3903 Stock Exchange LIS最长上升子序列

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

POJ 1860 Currency Exchange (最短路)

POJ-1860 Currency Exchange (最短路)

POJ #1860 Currency Exchange 最短路径算法 判断负环

1178 H. Stock Exchange