最長上升子序列

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAX=50000;
using namespace std;
int arr[MAX+50],ans[MAX+50],len;
int binary_search(int i)//手寫二分法
{
    int left,right,mid;
    left=0,right=len;
    while(left<right)
    {
        mid = left+(right-left)/2;
        if(ans[mid]>=arr[i]) right=mid;
        else left=mid+1;
    }
    return left;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>arr[i];
    ans[0] = arr[1];
    len=0;
    for(int i=2; i<=n; i++)
    {
        if(arr[i]>ans[len])
            ans[++len]=arr[i];
        else
        {
            int pos=binary_search(i);
            //int pos=lower_bound(ans,ans+len,arr[i])-ans;//也可直接使用STL庫裏的函數
            ans[pos] = min(ans[pos],arr[i]);
        }
    }

    cout<<len+1<<endl;//數組大小就是最長上升子序列的個數

}

發佈了29 篇原創文章 · 獲贊 14 · 訪問量 4149
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章