最长不下降序列解决算法
#include "stdafx.h" #include<iostream> #include<cstdio> #include<cstring> using namespace std; long long d[100000],a[100000]; long long len,i,k,n; long long min(long long t) { long long s,w,mid; s=0; w=len; while(s<w) { mid=(s+w)/2; if(d[mid]<=t) s=mid+1; else w=mid; } return s; } int _tmain(int argc, _TCHAR* argv[]) { cin>>n; for(i=1;i<=n;i++) cin>>a[i]; len=0; d[0]=-29888888;//设一个非常小的数字 for(i=1;i<=n;i++) { if(a[i]>=d[len]) { len++; d[len]=a[i]; cout<<d[len]<<" "; }//放置数组 else { k=min(a[i]); d[k]=a[i]; } } cout<<endl; cout<<len<<endl; return 0; }
注意:这个算法可以获得最长序列的长度值,但是数组d中保存的并不是最长长度的元素。