zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    php函数总结
    文本框输入限制
    e.keyCode和e.which使用
    transform总结
    wampSever的mysql操作
    linux命令总结
    nginx总结
    微雪的stm32学习资料
    串口+RS485驱动
    cubemx+stm32串口学习汇总资料
  • 原文地址:https://www.cnblogs.com/hhxj/p/7123363.html
Copyright © 2011-2022 走看看