最长上升子序列

#include <iostream>
using namespace std;
const int maxn=100005;
int a[maxn],dp[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int res=0;
    for(int i=1;i<=n;i++){
        int l=0,r=res;
        while(l<r){
            int mid=l+r+1>>1;
            if(dp[mid]<a[i])l=mid;
            else r=mid-1;
        }
        res=max(res,l+1);
        dp[l+1]=a[i];
    }
    printf("%d",res);
}

  

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1001][2];
int main()
{
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        dp[i][0]=dp[i][1]=1;
        for(int j=1;j<i;j++){
            if(a[j]<a[i])dp[i][0]=max(dp[i][0],dp[j][0]+1);
            if(a[j]>a[i])dp[i][1]=max(dp[i][1],max(dp[j][0],dp[j][1])+1);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    ans=max(ans,max(dp[i][0],dp[i][1]));
    cout<<ans;
}

作者:Acception
链接:https://www.acwing.com/activity/content/code/content/1332901/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
登山(先上升,再下降)

 

posted @ 2021-05-18 10:08  Acception  阅读(37)  评论(0)    收藏  举报