二分LIS 20分求调
查看原帖
二分LIS 20分求调
995390
codePanclA楼主2023/11/24 20:20
#include <algorithm>
#include <cstring>
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const int N=1000; 
int n,a[N],bs[N],bj[N]; 
int l1[N],l2[N];
int main(int argc, char** argv) {
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bs[1]=a[1];
	int len =1;
	for(int i=2;i<=n;i++){
		if(a[i]>bs[len]){
			bs[++len]=a[i];
		}else{
			int l=1,r=len;
			while(l<=r){
				int mid=(l+r)/2;
				if(a[i]>bs[mid]) l=mid+1;
				else r=mid-1;
			}
			bs[l]=a[i];
		}
		l1[i]=len;
	}
	len=1;
	l2[n]=l1[1]=1;
	bj[1]=a[n];
	for(int i=n-1;i>=1;i--){
		if(a[i]>bj[len]){
			bj[++len]=a[i];
		}else{
			int l=1,r=len;
			while(l<=r){
				int mid=(l+r)/2;
				if(a[i]>bj[mid]) l=mid+1;
				else r=mid-1;
			}
			bj[l]=a[i];
		}
		l2[i]=len;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,l1[i]+l2[i]-1);
	}
	cout<<ans;
	return 0;
}
2023/11/24 20:20
加载中...