POJ-1631 Bridging signals

题目大意:就是求最长的上升子序列,输出长度。

思路:LIS水题。就是题目描述的特别长。

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int a[40005];
 7 int dp[40005];
 8 int mx[40005];
 9 int INF=9999999;
10 int main(){
11     int T;
12     cin>>T;
13     while(T--){
14         int n;
15         cin>>n;
16         for(int i=1;i<=n;i++)
17             scanf("%d",&a[i]);
18         for(int i=0;i<=40003;i++)
19             mx[i]=INF;
20         mx[0]=0;
21         int len=0;
22         for(int i=1;i<=n;i++){
23             for(int j=len;j>=0;j--){
24                 if(a[i]>mx[j]){
25                     dp[i]=j+1;
26                     mx[j+1]=min(a[i],mx[j+1]);
27                     break;
28                 }
29             }
30             len=max(len,dp[i]);
31         }
32         cout<<len<<endl;
33     }
34     return 0;
35 }

 

posted @ 2017-07-30 20:19  ISGuXing  阅读(244)  评论(0编辑  收藏  举报