zoukankan      html  css  js  c++  java
  • UVa 11456

      题目大意:给一个车辆到达车站的序列(按时间先后),可以对车辆进行以下处理:插在队首、插在队尾或者拒绝进站。车站内的车辆必须按照重量大小从大到小排列,问车站内最多能有多少辆车辆?

      假设车i是第一个进站,那么在i后面的车辆如果比i车重,可以插在i的前面,如果比i车轻,可以插在i的后面。这就变成了求以i为起点的最大递增子序列和最大递减子序列了,i首先进站的最大长度为LIS(i)+LDS(i)-1,找出其中的最大值就可以了。

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 #define MAXN 2010
     5 
     6 int a[MAXN], lis[MAXN], lds[MAXN];
     7 
     8 int main()
     9 {
    10 #ifdef LOCAL
    11     freopen("in", "r", stdin);
    12 #endif
    13     int T;
    14     scanf("%d", &T);
    15     while (T--)
    16     {
    17         int n;
    18         scanf("%d", &n);
    19         for (int i = 0; i < n; i++)
    20             scanf("%d", &a[i]);
    21         for (int i  = n-1; i >= 0; i--)
    22         {
    23             lis[i] = lds[i] = 1;
    24             for (int j = i+1; j < n; j++)
    25             {
    26                 if (a[i] < a[j])  lis[i] = max(lis[i], lis[j]+1);
    27                 if (a[i] > a[j])  lds[i] = max(lds[i], lds[j]+1);
    28             }
    29         }
    30         int ans = 0;
    31         for (int i = 0; i < n; i++)
    32             ans = max(ans, lis[i]+lds[i]-1);
    33         printf("%d
    ", ans);
    34     }
    35     return 0;
    36 }
    View Code

      做的有点随便了,大概想了一下就开始写了,最初LIS(i)和LDS(i)保存的是以i为终点的最大XX子序列,根本就没想清楚,完全凭感觉了...后来改了还是WA了,然后就觉得是n可以等于0的问题,没好好看题-_-|| ,这个WA了4次才过,无语啊...

  • 相关阅读:
    联合省选 2020 题解
    [省选联考 2020 A 卷] 组合数问题
    【NOI2016】循环之美
    MySQL 之 json 数据操作
    使用Redis和定时实现延时消费
    事务,这次还有不清楚的吗,一次实战坑
    哨兵redis配置
    记录一次shell脚本的使用
    记录一次工作中的SQL优化,临时表和CountDownLatch
    JAVA流读取文件并保存数据
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3308318.html
Copyright © 2011-2022 走看看