洛谷 P1020 导弹拦截

洛谷 P1020 导弹拦截

题意:

自己读题吧…

分析一下:

本题实则是求最长不升子序列长度和最长上升子序列长度(如不理解,自行思索)
此处附上一个我认为很好的关于单调子序列的博客:
https://www.cnblogs.com/kindleheart/p/8859151.html
PS:upper_bound和lower_bound函数只能用于递增序列,但是,凡是有个但是,稍加操作也可以用于递减。就好比sort()默认按升序排序,但价格cmp函数之后就可以降序排序
关于upper_bound和lower_bound函数,请参见:https://blog.csdn.net/qq1337715208/article/details/81072709

代码君:

#include 
using namespace std;
const int maxn = 1e5 + 5;
int h[maxn], a1[maxn], a2[maxn];
int main(int argc, char const *argv[])
{
    // freopen("input.txt", "r", stdin);
    int n = 1;
    while (~scanf("%d", h + n))
    {
        ++n;
    }
    n--;    //读入完成后n多加了1,我也不知道为啥,我也不敢问啊...

    int len1 = 1, len2 = 1;
    a1[1] = h[1];
    a2[1] = h[1];
    for (int i = 2; i <= n; ++i)
    {
        if (a1[len1] >= h[i])
            a1[++len1] = h[i];
        else
            *upper_bound(a1 + 1, a1 + 1 + len1, h[i], greater<int>()) = h[i];

        if (a2[len2] < h[i])
            a2[++len2] = h[i];
        else
            *lower_bound(a2 + 1, a2 + 1 + len2, h[i]) = h[i];
    }
    printf("%d\n%d\n", len1, len2);
    return 0;
}

你可能感兴趣的:(DP)