最長上升子序列 二分優化寫法
阿新 • • 發佈:2019-01-13
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1005 int a[maxn]; int d[maxn]; int n; int len; int find(int x) {int l=1,r=len; while(l<r) { int mid=(l+r)>>1; if(d[mid]>=x) r=mid; else l=mid+1; } return l; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; d[1]=a[1]; len=1; for(int i=2;i<=n;i++) { if(a[i]>d[len]) d[++len]=a[i]; else { int w=find(a[i]); d[w]=a[i]; } } printf("%d\n",len); return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1005 int a[maxn]; int d[maxn]; int n; int len; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; d[1]=a[1]; len=1; for(int i=2;i<=n;i++) { if(a[i]>d[len]) d[++len]=a[i]; else { int w=lower_bound(d+1,d+len+1,a[i])-d; d[w]=a[i]; } } printf("%d\n",len); return 0;