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 }

 

转载于:https://www.cnblogs.com/ISGuXing/p/7260275.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值