枚举每个位置,求以num[i]为起点的最长不下降子序列和以num[i]为结尾的最长不递增子序列。

并且把相同值的个数统计一下,最后要减去算重复了的。

比如:

1

9

4 4 2 2 2 3 3 3 7

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = + ; int n;
int num[MAXN];
int stack1[MAXN];
int stack2[MAXN];
int dp1[MAXN];
int dp2[MAXN];
int same1[MAXN];
int same2[MAXN]; void DP( int *stack, int *dp, int *same )
{
int top = ; stack[ ++top ] = num[]; dp[] = ;
same[] = ;
int temp; for ( int i = ; i < n; i++ )
{
int x = upper_bound( stack + , stack + top + , num[i] ) - stack;
int y = lower_bound( stack + , stack + top + , num[i] ) - stack; if ( num[i] >= stack[top] )
{
stack[ ++top ] = num[i];
temp = top;
}
else
{
stack[x] = num[i];
temp = x;
}
dp[i] = temp;
same[i] = x - y + ;
} return;
} int main()
{
int T;
scanf("%d", &T);
while ( T-- )
{
scanf( "%d", &n );
for ( int i = n - ; i >= ; --i )
scanf( "%d", &num[i] ); DP( stack1, dp1, same1 ); for ( int i = ; i < n; ++i )
{
// printf( "%d ", num[i] );
num[i] = -num[i];
}
//puts("");
DP( stack2, dp2, same2 ); int ans = ;
for ( int i = ; i < n; ++i )
{
//printf( "%d %d\n", dp1[i], dp2[i] );
//printf( "**%d %d\n", same1[i], same2[i] );
ans = max( ans, dp1[i] + dp2[i] - min( same1[i], same2[i] ) );
} printf( "%d\n", ans );
}
return ;
}

最新文章

  1. JS-underfined is not a function
  2. 使用 PHP 过滤器(Filter)进行严格表单验证
  3. 第五章:Logistic回归
  4. CSS样式表引用方式
  5. GIS科研站
  6. Android视图框架
  7. 简单的遮罩层效果,user登陆显示效果
  8. ScreenCaptureHtmlUnitDriver.java
  9. Java Stream
  10. salesforce lightning零基础学习(十一) Aura框架下APP构造实现
  11. Linux iptables设置
  12. 服务器SSL不安全漏洞修复方案
  13. Linux----centos安装mysql
  14. 缺陷管理工具Jira安装参考
  15. Spring Cloud Config 配置高可用集群
  16. MVC的路由设置【转】
  17. display:inline、block、inline-block区别
  18. 更改KVM虚拟机root的密码
  19. HDU1510 White rectangles( 乱搞 O(n^3) )题解
  20. 配置bootstrap环境

热门文章

  1. zendframework 事件管理(一)
  2. Eclipse下jad反编译之&ldquo;类文件查看器&rdquo;不能处理给定的输入错误解决
  3. [MVC] - 异步调用后台的常用方法。
  4. 敏捷开发之道(三)极限编程XP续
  5. JS读取UserAgent信息并做判断
  6. linux 下 安装 rpm 格式 的 mysql
  7. UVA 10720 Graph Construction 贪心+优先队列
  8. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
  9. Linux查看系统基本信息
  10. sgu 138