最大不降子序列
解法1(二分法:o(n*log2(n))):
1 #include <stdio.h> 2 #include <iostream> 3 #define MAXN 10000 4 using namespace std; 5 6 int a[MAXN], low[MAXN]; 7 8 int main(void) 9 { 10 int n; 11 while(cin >> n) 12 { 13 low[1]=a[1]; 14 int now=1; 15 for(int i=1; i<=n; i++) 16 cin >> a[i]; 17 for(int i=2; i<=n; i++) 18 { 19 if(a[i]>low[now]) low[++now]=a[i]; 20 else 21 { 22 int pos=lower_bound(low, low+now, a[i]) - low; 23 low[pos]=a[i]; 24 } 25 } 26 cout << now << endl; 27 } 28 return 0; 29 }
解法2(二分法队列实现:o(n*long2(n))):
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #define MAXN 1000000 5 using namespace std; 6 7 int main(void) 8 { 9 int n; 10 while(cin >> n) 11 { 12 int stack[MAXN]; 13 int top=0; 14 stack[0]=-1; 15 for(int i=1; i<=n; i++) 16 { 17 int temp; 18 cin >> temp; 19 if(temp>stack[top]) stack[++top]=temp; 20 else 21 { 22 int pos=lower_bound(stack, stack+top, temp)-stack; 23 stack[pos]=temp; 24 } 25 } 26 cout << top << endl; 27 } 28 return 0; 29 }
解法3(o(n*n)):
1 #include <stdio.h> 2 #include <iostream> 3 #define MAXN 10000+10 4 using namespace std; 5 6 int main(void) 7 { 8 int n; 9 while(cin >> n) 10 { 11 int a[MAXN], alen[MAXN], maxlen=1; 12 for(int i=1; i<=n; i++) 13 alen[i]=1; 14 for(int i=1; i<=n; i++) 15 cin >> a[i]; 16 for(int i=2; i<=n; i++) 17 { 18 int max=0; 19 for(int j=1; j<=i-1; j++) 20 if(a[j]<a[i] && max<alen[j]) max=alen[j]; 21 alen[i]=max+1; 22 if(alen[i]>maxlen) maxlen=alen[i]; 23 } 24 cout << maxlen << endl; 25 } 26 return 0; 27 }
方法4(dp(o(n*n))):
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <iostream> 5 #define MAXN 100 6 using namespace std; 7 8 int main(void) 9 { 10 int n; 11 while(cin >> n) 12 { 13 int a[MAXN], low[MAXN]; 14 memset(low, 0, sizeof(low)); 15 for(int i=0; i<n; i++) 16 cin >> a[i]; 17 for(int i=0; i<n; i++) 18 { 19 for(int j=i+1; j<n; j++) 20 { 21 if(a[j]>a[i]) 22 low[j]++; 23 } 24 25 } 26 sort(low, low+n); 27 cout << low[n-1]; 28 } 29 return 0; 30 }
我就是我,颜色不一样的烟火 --- geloutingyu