D - array array array HDU - 6197解题报告

一道DP水题,求最长上升子序列(LIS)问题,二分是省时的关键!!!唯一的不同就只是倒过来看看而已,唉,再次输给DP,等我把你学会了再说的。最长子序列详解+模板

题目链接:https://vjudge.net/problem/HDU-6197

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
int a[maxn],t[maxn];
int dp[maxn];

int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        int n,k; scanf("%d %d",&n,&k);
        for(int i=0;i<n;i++) scanf("%d",&a[i]);

        int pos=0;
        for(int i=n-1;i>=0;i--) t[pos++]=a[i];

        fill(dp,dp+n,INF);
        for(int i=0;i<n;i++)
            *lower_bound(dp,dp+n,a[i])=a[i];

        int cnt=lower_bound(dp,dp+n,INF)-dp;
        if(cnt+k>=n) {printf("A is a magic array.\n"); continue;}

        fill(dp,dp+n,INF);
        for(int i=0;i<n;i++)
            *lower_bound(dp,dp+n,t[i])=t[i];

        cnt=lower_bound(dp,dp+n,INF)-dp;
        if(cnt+k>=n) {printf("A is a magic array.\n"); continue; }
        printf("A is not a magic array.\n");

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/NCC__dapeng/article/details/82216565