zoukankan      html  css  js  c++  java
  • UVa 1471 防线

    https://vjudge.net/problem/UVA-1471

    题意:给出一个序列,删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增子序列,输出个数。

    思路:首先可以计算出以i结尾的最大连续递增子序列个数 f(i) 和以i开头的最大连续递增子序列 g(i)。之后就是动态规划吧,题目挺抽象,不太好解释,具体看代码吧。

     1 #include<iostream>  
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 100000 * 2 + 5;
     6 
     7 int n;
     8 int a[maxn];
     9 int f[maxn], g[maxn],d[maxn];
    10 
    11 int main()
    12 {
    13     //freopen("D:\txt.txt", "r", stdin);
    14     int t;
    15     cin >> t;
    16     while (t--)
    17     {
    18         cin >> n;
    19         for (int i = 1; i <= n; i++)
    20             cin >> a[i];
    21         f[1] = 1;
    22         for (int i = 2; i <= n; i++)
    23             f[i] = a[i] > a[i - 1] ? f[i - 1] + 1 : 1;
    24         g[n] = 1;
    25         for (int i = n - 1; i >= 1; i--)
    26             g[i] = a[i] < a[i + 1] ? g[i + 1] + 1 : 1;
    27         int ans = 0;
    28         for (int i = 1; i <= n; i++)
    29             d[i] = 1 << 30;
    30         for (int i = 1; i <= n; i++)
    31         {
    32             //low_bound的返回值就是以a[i]为尾的连续递增子序列
    33             int len = (lower_bound(d + 1 , d + 1 + i , a[i]) - (d + 1)) + g[i];
    34             ans = max(len, ans);
    35             d[f[i]] = min(a[i], d[f[i]]); //如果以i结尾的最大连续递增子序列个数相同,那么选择数小的
    36         }
    37         cout << ans << endl;
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    sublimeformaya
    sitecustomize.py 用法
    计蒜客之矩阵翻转
    计蒜客之判断质数
    计蒜客之斐波那契数列
    LTE 测试文档(翻译)
    Manual——Test (翻译1)
    LTE Manual ——Logging(翻译)
    嵌入式linux的学习之路[转]
    C语言预处理程序[转]
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6354012.html
Copyright © 2011-2022 走看看