最大不降子序列

解法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 }

 



posted @ 2016-09-02 21:20  geloutingyu  阅读(245)  评论(0编辑  收藏  举报