#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 200000
int t,n,a[maxn],f[maxn],g[maxn],d[maxn],ans;
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",a+i);
a[n]=-inf;
for(int l=0,r=0;r<n;r++)
{
if(a[r+1]<=a[r]){
for(int i=l;i<=r;i++) f[i]=r-i+1,g[i]=i-l+1;
/*这句代码写的好!*/
l=r+1;
}
}
memset(d,inf,sizeof(d));
ans=0;
for(int i=0;i<n;i++)
{
int j=lower_bound(d+1,d+n+1,a[i])-d-1;
ans = max(ans,f[i]+j);
d[g[i]]=min(d[g[i]],a[i]);
}
/*看不懂了*/
printf("%d\n",ans);
}
return 0;
}[是用数据结构]UVa1471 - Defense Lines
最新推荐文章于 2019-09-14 10:18:14 发布
本文介绍了一种使用C++实现的动态规划算法,通过一个具体的编程实例详细展示了如何利用数组进行状态转移,并结合二分查找优化解决方案。该算法能够有效地解决特定类型的最大子序列和问题。

962

被折叠的 条评论
为什么被折叠?



