最长不下降子序列

Posted Go

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长不下降子序列相关的知识,希望对你有一定的参考价值。

题目大意:
输入两个数n和k代表数组元素个数和可以删掉元素的个数,让你删掉k个数,如果存在一种方式删掉数之后序列是不下降或者不上升的,则输出A is a magic array.否则输出A is not a magic array.
基本思路:
最长上升子序列(不下降而已,略有不同);
反思与总结:
哎,不扎实啊,太菜了,还是看板子,手写写不出,难受,既如此,便要用命来干了(此言不虚);
代码如下:

#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn = 100000+10;

int ans[maxn];
int rec[maxn];


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&ans[i]);
        }
        int len=1;
        rec[1]=ans[1];
        for(int i=2;i<=n;i++)
        {
            if(ans[i]>=rec[len]) rec[++len]=ans[i];
            else
            {
                int tmp=upper_bound(rec+1,rec+len+1,ans[i])-rec;
                rec[tmp]=ans[i];
            }
        }
        if(len+k>=n)
        {
            printf("A is a magic array.\n");
        }
        else
        {
            len=1;
            rec[1]=ans[n];
            for(int i=n-1;i>=1;i--)
            {
                if(ans[i]>=rec[i]) rec[++len]=ans[i];
                else
                {
                    int tmp=upper_bound(rec+1,rec+len+1,ans[i])-rec;
                    //左闭右开
                    rec[tmp]=ans[i];
                }
            }
            if(len+k>=n) printf("A is a magic array.\n");
            else printf("A is not a magic array.\n");
        }
    }
    return 0;
}

 

以上是关于最长不下降子序列的主要内容,如果未能解决你的问题,请参考以下文章

最长不下降子序列

最长不下降子序列

「模板」最长不下降子序列 LIS

最长不下降子序列 nlogn && 输出序列

最长不下降子序列 (O(nlogn)算法)

单调栈最长不下降子序列变式