題目1533:最長上升子序列php
http://ac.jobdu.com/problem.php?pid=1533ios
時間限制:1 秒數組
內存限制:128 兆測試
特殊判題:否spa
提交:857code
解決:178blog
給定一個整型數組, 求這個數組的最長嚴格遞增子序列的長度。 譬如序列1 2 2 4 3 的最長嚴格遞增子序列爲1,2,4或1,2,3.他們的長度爲3。內存
輸入可能包含多個測試案例。
對於每一個測試案例,輸入的第一行爲一個整數n(1<=n<=100000):表明將要輸入的序列長度
輸入的第二行包括n個整數,表明這個數組中的數字。整數均在int範圍內。get
對於每一個測試案例,輸出其最長嚴格遞增子序列長度。input
4 4 2 1 3 5 1 1 1 1 1
2 1
#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int N=110000; int n,val[N]; vector<int> vt; int binarySearch(int x){ int left=0,right=vt.size()-1; int mid; while(left<=right){ mid=(left+right)>>1; if(vt[mid]<x) left=mid+1; else right=mid-1; } return left; } int main(){ //freopen("input.txt","r",stdin); while(~scanf("%d",&n)){ vt.clear(); for(int i=0;i<n;i++) scanf("%d",&val[i]); int tmp; for(int i=0;i<n;i++){ tmp=binarySearch(val[i]); if(tmp>=(int)vt.size()) vt.push_back(val[i]); else vt[tmp]=val[i]; } int ans=vt.size(); printf("%d\n",ans); } return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110000; int n,val[N],a[N]; int len,arr[N]; int lowbit(int x){ return x&(-x); } void update(int i,int x){ while(x<=len){ if(i>arr[x]) arr[x]=i; x+=lowbit(x); } } int query(int x){ int ans=0; while(x){ if(arr[x]>ans) ans=arr[x]; x-=lowbit(x); } return ans; } int main(){ freopen("input.txt","r",stdin); while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d",&val[i]); a[i]=val[i]; } sort(a,a+n); len=unique(a,a+n)-a; memset(arr,0,sizeof(arr)); int ans=1,tmp; for(int i=0;i<n;i++){ val[i]=lower_bound(a,a+len,val[i])-a+1; tmp=query(val[i]-1)+1; if(tmp>ans) ans=tmp; update(tmp,val[i]); } printf("%d\n",ans); } return 0; }