一道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;
}