导弹拦截系统之最长不下降子序列以及最长上升子序列

玄学:求一个序列里面最少有多少最长不上升序列等于求这个序列里最长上升序列的长度

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],ans[N];
int main(){
	int n;
	while(~scanf("%d",&n)){
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		int len=1;ans[1]=a[1];
		for(int i=2;i<nn;i++){
			if(a[i]>ans[len]) ans[++len]=a[i];
			else{
				int pos=lower_bound(ans+1,ans+len+1,a[i])-ans;
				ans[pos]=a[i];
			}
		}
	}
	//cout<<nn<<endl; 
	int len=1;ans[1]=a[1];
	for(int i=2;i<nn;i++){
		if(a[i]>ans[len]) ans[++len]=a[i];
		else{
			int pos=lower_bound(ans+1,ans+len+1,a[i])-ans;
			ans[pos]=a[i];
		}
	}
	memset(ans,0,sizeof(ans));  
	//最长不下降子序列 
	int len_=1;ans[len_]=-a[1];
	for(int i=2;i<nn;i++){
		if(-a[i]>=ans[len_]) ans[++len_]=-a[i];
		else{
			int pos=upper_bound(ans+1,ans+len_+1,-a[i])-ans;
			ans[pos]=-a[i]; 
		} 
	}
	cout<<len_<<" "<<len<<endl;
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/vainglory/p/9021235.html