hdu 5489

题意:给出一个长度为n的数列,删去长度为l的子数列,问最长严格上升子序列

思路:我们可以求出每个数字以他为起点的上升序列长度q[i],然后我们可以得到在我这个数字a[i]在i-m之前的那些数的上升序列排第K个,那么就是K-1+q[i]。然而开始我求q[i]的时候,是这样想的,先求一遍正的LIS,最长长度为Max,那么q[i]=Max-他在子序列排第几位+1,WA到死,比如 5 7 6 4 9 ,4在第一位,9在第3位,然而以4为起点只有长度2

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 const int INF=1e9+10;
 5 
 6 int a[N],b[N];
 7 int z[N],q[N];
 8 int dp[N];
 9 
10 int main(){
11     int t;
12     int n,m;
13     int k=1;
14     scanf("%d",&t);
15     while(t--){
16         int Max=0;
17         scanf("%d%d",&n,&m);
18         for(int i=1;i<=n;i++) {scanf("%d",&a[i]);b[i]=-a[i];dp[i]=INF;}
19         for(int i=n;i>=1;i--){
20             int k=lower_bound(dp+1,dp+1+n,b[i])-dp;
21            // cout<<b[i]<<" "<<k<<endl;
22             q[i]=k;
23             dp[k]=b[i];
24         }
25          Max=0;
26          int y=0;
27          for(int i=1;i<=n;i++) dp[i]=INF;
28          for(int i=1;i<=n-m;i++){
29              int k=lower_bound(dp+1,dp+1+n,a[i+m])-dp;
30              Max=max(Max,k-1+q[i+m]);
31               k=lower_bound(dp+1,dp+1+n,a[i])-dp;
32              dp[k]=a[i];
33              y=max(y,k);
34          }
35          Max=max(Max,y);
36          printf("Case #%d: %d
",k++,Max);
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/hhxj/p/7123363.html