链接:点击打开链接
题意:有n个数,依次进行操作,每次可以把这个数放在deque首部,也可以放在尾部,也可以扔掉,但是要保证deque中的数是非递减的,问最后deque的最大长度
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int a[100005],dp[200005];
int main(){ //转换完就是求每个数最长上升和最长下降
int t,n,i; //的和在减去重复使用的部分,关键在于重
scanf("%d",&t); //复使用的部分如何处理
while(t--){
scanf("%d",&n);
memset(dp,INF,sizeof(dp));
for(i=0;i<n;i++)
scanf("%d",&a[i]); //我们可以从后向前,将每个数变成2*a[i]+1
for(i=n-1;i>=0;i--) //求一遍最长上升,再从前向后变成2*a[i],
*upper_bound(dp,dp+2*n,2*a[i]+1)=2*a[i]+1;
for(i=0;i<n;i++) //这样就避免了每个数的重复使用,而且保证
*upper_bound(dp,dp+2*n,2*a[i])=2*a[i]; //了从前向后的能接上从后向前的
printf("%d\n",lower_bound(dp,dp+2*n,INF)-dp);
}
return 0;
}