1.最长上升子序列:

#include <iostream>
using namespace std;
int n, a[100005], f[100005], d[100005], ans;
int max_len(int x)
{
    int l=1,r=n,ans=1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(d[mid]>=x)
        {
            ans=mid;
            r=mid-1;
        }
        else
        {
            l=mid+1;
        }
    }
    return ans;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        d[i] = 10000;
    }
    ans = 0;
    for (int i = 1; i <= n; i++)
    {
        int now = max_len(a[i]);
        f[i] = now;
        d[now] = a[i];
        ans = max(ans, f[i]);
    }
    cout << ans << endl;
    for (int i = 1; i <= n; i++)
        cout << f[i] << " ";
    cout << endl;
    for (int i = 1; i <= n; i++)
        cout << d[i] << " ";
    cout << endl;
    return 0;

2.山峰序列长度:

#include<iostream>  
#include<algorithm>  
using namespace std;  
int a[10005], d1[10005], d2[10005], f[10005], g[10005];
int main()  
{   
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
	cin >> a[i];
	d1[i] = d2[i] = 100000;
    }
    int ans = 0;  
    for (int i = 1; i <= n; i++)  
    {  
        int now = lower_bound(d1 + 1, d1 + n + 1, a[i]) - d1;
        f[i] = now;
        d1[now] = a[i];
    }
    for(int i=n;i>=1;i--)
    {
        int now=lower_bound(d2+1,d2+n+1,a[i])-d2;
        g[i]=now;
        d2[now]=a[i];
    }
    for (int i = 1; i <= n; i++)
        ans = max(ans, f[i] + g[i] - 1);
    cout << ans << endl;
    return 0;  
}

 3.最长不上升子序列长度:

#include <iostream>
#include <algorithm>
using namespace std;
int a[10005],d[10005],f[10005];
int main()
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
        d[i]=1000000;
    }
    int ans=0;
    for(int i=n;i>=1;i--)
    {
        int now = upper_bound(d+1,d+n+1,a[i])-d;
        f[i]=now;
        d[now]=a[i];
        ans=max(ans,f[i]);
    }
    cout << ans << endl;
    return 0;
}

 4.最长不下降子序列长度:

#include<bits/stdc++.h>
using namespace std;
int n,ans=1,a[10005],b[10005]; 
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    	scanf("%d",&a[i]);
	}
    b[1]=a[1];
    for(int i=2;i<=n;i++){
        if(a[i]>=b[ans]){
        	b[++ans]=a[i];
		}
        else{
            int j=upper_bound(b+1,b+ans+1,a[i])-b;
            b[j]=a[i]; 
        }
    }
    printf("%d",ans);    
    return 0;
}

5.最长下降子序列长度:

#include<bits/stdc++.h>
using namespace std;
int n,t;
int mas[10009];
int k[10009]; 
int main()
{
    cin>>n;
    while(n--){
        cin>>t;
        for(int i=1;i<=t;++i) cin>>mas[i];
        for(int i=1;i<=t;++i){
            k[i]=1;
            for(int j=1;j<i;++j){
                if(mas[i]<mas[j]&&k[j]+1>k[i])
                k[i]=k[j]+1;
            }
        }
        int maxn=k[1];
        for(int i=1;i<=t;++i){
            maxn=max(maxn,k[i]);
        }
        cout<<maxn<<endl;
    }
    return 0;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐