题目
题意
dp,lcs。给你一个 A 数列,和一个数字 k。问你能不能从 A 数列顺序中挑出 k 个元素组成新数列。新数列要满足非递增或非递减。
题解
就是求最长上升子序列 length1 和最长下降子序列 length2。然后如果 (length(A) - length1 <= k || length(A) - length2 <= k) 就可以,反之则不行。
代码
#include <algorithm>
#include <bitset>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <climits>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
const int MAX = 100005;
int a[MAX];
int dp[MAX];
int main(){
int t;
cin >> t;
while(t--){
int n, k;
cin >> n >> k;
for(int i=0;i<n;++i) {
scanf("%d",&a[i]);
}
fill(dp,dp+n,INT_MAX);
for(int i=0;i<n;++i) {
*lower_bound(dp, dp + n, a[i]) = a[i];
}
int id = 0;
for(int i=0;i<n;++i){
if(dp[i] != INT_MAX)
id = i + 1;
}
bool flag = false;
if(n - id <= k)
flag = true;
else{
for(int i=0;i<n/2;++i){
swap(a[i],a[n-i-1]);
}
fill(dp,dp+n,INT_MAX);
for(int i=0;i<n;++i) {
*lower_bound(dp, dp + n, a[i]) = a[i];
}
id = 0;
for(int i=0;i<n;++i){
if(dp[i] != INT_MAX)
id = i + 1;
}
if(n - id <= k)
flag = true;
}
if(flag)
cout << "A is a magic array." << endl;
else
cout << "A is not a magic array." << endl;
};
return 0;
}