您的位置:首页 > 其它

题目1533:最长上升子序列

2017-07-01 17:40 274 查看
区间dp,显然二次循环

代码如下

#include <iostream>

#include <queue>

#include <iomanip>

#include <vector>

#include <queue>

#include <map>

#include <stack>

#include <cstdio>

#include <algorithm>

#include <cmath>

#include <set>

#include <sstream>

#include <cstring>

using namespace std;

int nums[100001];

int dp[100001];

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        for(int i=1;i<=n;i++)

        {

            scanf("%d",&nums[i]);

        }

        int len=0;

        for(int i=1;i<=n;i++)

        {

            if(!len||(nums[i]>dp[len]))

                dp[++len]=nums[i];

            else

            {

                int ll=1;

                int rr=len;

                int mid;

                while(ll<rr)

                {

                    mid=(ll+rr)/2;

                    if(nums[i]>dp[mid])

                    {

                        ll=mid+1;

                    }

                    else if(nums[i]<dp[mid])

                    {

                        rr=mid;

                    }

                    else

                        break;

                }

                dp[ll]=min(nums[i],dp[ll]);

            }

        }

        printf("%d\n",len);

    }

    return 0;

}会超时的,引入一个栈,复杂度为n*log(n)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: