天天看点

poj 3903-Stock Exchange最大上升子序(dp)

solve1,方法会超时,

关于lower_bound()的用法,实现算法点击打开链接

用法点击打开链接

#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n;
const int maxn=1000005;
int a[maxn];
int dp[maxn];
const int INF=9999999999;
void solve1()
{   int res=0;
    for(int i=0;i<n;i++)
    {
        dp[i]=1;
        for(int j=0;j<i;j++)
            if(a[j]<a[i])
            dp[i]=max(dp[i],dp[j]+1);
    res=max(res,dp[i]);
    }
    printf("%d\n",res);
}
void solve2()
{
    fill(dp,dp+n,INF);
    for(int i=0;i<n;i++)
       *lower_bound(dp,dp+n,a[i])=a[i];
    printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
}
int main()
{
    int T;
    cin>>T;

    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
     //solve1();
    solve2();
    }

    return 0;
}