几个常见的子序列——c++(最长上升子序列,山峰序列,最长不上升子序列,最长不下降子序列,最长下降子序列)
【代码】几个常见的子序列——c++(最长上升子序列,山峰序列,最长不上升子序列,最长不下降子序列,最长下降子序列)
·
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;
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)