C. A Twisty Movement

time limit per test1 second

memory limit per test256 megabytes

Problem Description

A dragon symbolizes wisdom, power and wealth. On Lunar New Year’s Day, people model a dragon with bamboo strips and clothes, raise them with rods, and hold the rods high and low to resemble a flying dragon.

A performer holding the rod low is represented by a 1, while one holding it high is represented by a 2. Thus, the line of performers can be represented by a sequence a1, a2, …, an.

Little Tommy is among them. He would like to choose an interval [l, r] (1 ≤ l ≤ r ≤ n), then reverse al, al + 1, …, ar so that the length of the longest non-decreasing subsequence of the new sequence is maximum.

A non-decreasing subsequence is a sequence of indices p1, p2, …, pk, such that p1 < p2 < … < pk and ap1 ≤ ap2 ≤ … ≤ apk. The length of the subsequence is k.

Input

The first line contains an integer n (1 ≤ n ≤ 2000), denoting the length of the original sequence.

The second line contains n space-separated integers, describing the original sequence a1, a2, …, an (1 ≤ ai ≤ 2, i = 1, 2, …, n).

Output

Print a single integer, which means the maximum possible length of the longest non-decreasing subsequence of the new sequence.

Examples

input

4

1 2 1 2

output

4

input

10

1 1 2 2 2 1 1 2 2 1

output

9

Note

In the first example, after reversing [2, 3], the array will become [1, 1, 2, 2], where the length of the longest non-decreasing subsequence is 4.

In the second example, after reversing [3, 7], the array will become [1, 1, 1, 1, 2, 2, 2, 2, 2, 1], where the length of the longest non-decreasing subsequence is 9.


解题心得:

  1. 题意很简单就是输出最长不递减子序列的长度。
  2. 读错题了啊,把子序列看成子区间弄错了,。
  3. 就是一个dp加一点思维
    • 先求出1的前缀和,2的后缀和
    • dp[i][j][1]代表在区间(i,j)之间以1结尾的最长不递增子序列的长度。

      dp[i][j][2]代表在区间(i,j)之间以2结尾的最长不递增子系列的长度。
    • 状态转移方程式就很容易出来了dp[i][j][1] = max(dp[i][j-1][1],dp[i][j-1][2]) + (num[j] == 1)

      dp[i][j][2] = dp[i][j-1][2] + (num[j] == 2)
  4. 至于为什么要求不递增的dp,那就是要翻转啊,翻转之后不递增不就变成不递减了吗。而前缀和和后缀和就是考考思维。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
int dp[maxn][maxn][3],num[maxn],sum1[maxn],sum2[maxn];
int Max = -1,n; int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
for(int i=0;i<n;i++)
sum1[i] = sum1[i-1] + (num[i] == 1);
for(int i=n-1;i>=0;i--)
sum2[i] = sum2[i+1] + (num[i] == 2);
for(int i=0;i<n;i++)
for(int j=i;j<n;j++){
dp[i][j][2] = dp[i][j-1][2] + (num[j] == 2);
dp[i][j][1] = max(dp[i][j-1][1],dp[i][j-1][2]) + (num[j] == 1);
Max = max(dp[i][j][1] + sum1[i-1] + sum2[j+1],Max);
Max = max(dp[i][j][2] + sum1[i-1] + sum2[j+1],Max);
}
printf("%d",Max);
return 0;
}

最新文章

  1. JS控制div跳转到指定的位置的解决方案总结
  2. input checkbox属性-Indeterminate状态
  3. symfony2 安装并创建第一个页面
  4. aehyok.com的成长之路二——技术选型
  5. 0814JavaScript简介、基本语法、运算符、转换
  6. web调试技巧
  7. Analyzer的报表复制、移动
  8. 【SNMP】SNMP概述
  9. IBM Rational ClearCase 部署指南
  10. 结合实例分析简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式的区别
  11. linux内核--进程地址空间(三)
  12. linux使用mount挂载iso文件
  13. 属性动画详解 Interpolator TypeEvaluator
  14. SqlBulkCopy 类
  15. R绘图字体解决方案(转)
  16. .NETCore 下支持分表分库、读写分离的通用 Repository
  17. git教程:撤销修改
  18. Vue之axios请求数据
  19. 环境变量PS1,修改命令行提示符样式
  20. Django(十五)Form组件

热门文章

  1. ACdream 1216——Beautiful People——————【二维LIS,nlogn处理】
  2. Mysql 如何设置字段自动获取当前时间,附带添加字段和修改字段的例子
  3. Storm里面fieldsGrouping和Field的概念详解
  4. shiro web环境初始化过程
  5. Json Web Token 简介
  6. Day6 盒模型
  7. Android——dpi相关知识总结
  8. uLua学习之使用协程(终)
  9. ImportError: No module named PIL
  10. linux 命令——7 mv(转)