poj 1631 Bridging signals
题目链接:http://poj.org/problem?id=1631
题目大意:求最长上升子序列的长度
解题思路:dp+二分搜索,时间复杂度为 O(n·logn). 直接 dp 时间复杂度 O(n2), 会 TLE.
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: poj 1631 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double PI=acos(-1.0); 27 28 const int x4[]={-1,0,1,0}; 29 const int y4[]={0,1,0,-1}; 30 const int x8[]={-1,-1,0,1,1,1,0,-1}; 31 const int y8[]={0,1,1,1,0,-1,-1,-1}; 32 33 typedef int T; 34 T max(T a,T b){ return a>b? a:b; } 35 T min(T a,T b){ return a<b? a:b; } 36 /////////////////////////////////////////////////////////////////////////// 37 38 /////////////////////////////////////////////////////////////////////////// 39 //Add Code: 40 /////////////////////////////////////////////////////////////////////////// 41 42 int main(){ 43 /////////////////////////////////////////////////////////////////////// 44 //Add code: 45 int Case,n,i,a[40005],b[40005]; 46 scanf("%d",&Case); 47 while(Case--){ 48 scanf("%d",&n); 49 for(i=1;i<=n;i++) scanf("%d",&a[i]); 50 int Max=0; 51 for(i=1;i<=n;i++){ 52 int L=1,R=Max; 53 while(L<=R){ 54 int M=(L+R)/2; 55 if(b[M]<a[i]) L=M+1; 56 else R=M-1; 57 } 58 b[L]=a[i]; 59 Max=max(Max,L); 60 } 61 printf("%d\n",Max); 62 } 63 /////////////////////////////////////////////////////////////////////// 64 return 0; 65 } 66 67 /////////////////////////////////////////////////////////////////////////// 68 /* 69 Testcase: 70 Input: 71 4 72 6 73 4 74 2 75 6 76 3 77 1 78 5 79 10 80 2 81 3 82 4 83 5 84 6 85 7 86 8 87 9 88 10 89 1 90 8 91 8 92 7 93 6 94 5 95 4 96 3 97 2 98 1 99 9 100 5 101 8 102 9 103 2 104 3 105 1 106 7 107 4 108 6 109 Output: 110 3 111 9 112 1 113 4 114 */ 115 ///////////////////////////////////////////////////////////////////////////
posted on 2013-08-24 19:50 SCNU20102200088 阅读(115) 评论(0) 编辑 收藏 举报