首页 > 其他 > 详细

最长不下降子序列 O(nlogn)

时间:2015-02-03 16:35:04      阅读:246      评论:0      收藏:0      [点我收藏+]
技术分享
 1 #include<stdio.h>
 2 int a[1000] , temp[1000] ;
 3 int n , top ;
 4 
 5 int binary_search (int x) {
 6     int fir = 0 ;
 7     int last = top ;
 8     int mid ;
 9     while (fir <= last ) {
10         mid = (fir + last) / 2 ;
11         if ( x <= temp[mid] ) {
12             last = mid - 1;
13         }
14         else {
15             if (x <= temp[mid + 1] )
16                 return mid + 1 ;
17             else
18                 fir = mid + 1 ;
19         }
20     }
21 }
22 
23 int main () {
24   //  freopen ("a.txt" ,"r" , stdin) ;
25     while ( scanf ("%d" , &n ) != EOF ) {
26         for (int i = 0 ; i < n ; i++ ) {
27             scanf ("%d" , &a[i]) ;
28         }
29 
30         top = 0 ;//目前最长不下降子序列的长度
31         temp[top] = a[0] ;////temp[i]为长度为i的上升子序列末尾元素的最小值
32         for (int i = 1 ; i < n ; i++ ) {
33             if ( a[i] >= temp[top] ) {
34                 temp[++top] = a[i] ;
35             }
36             else {
37                 if ( a[i] < temp[0] ) {
38                     temp[0] = a[i] ;
39                 }
40                 else {
41                     temp[binary_search(a[i])] = a[i] ;
42                 }
43             }
44         }
45         printf ("%d\n" , top + 1) ;
46     }
47     return 0 ;
48 }
用二分查找法

 

最长不下降子序列 O(nlogn)

原文:http://www.cnblogs.com/get-an-AC-everyday/p/4270130.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!