做 1 的 前 缀 和 和 2 的 后 缀 和 做1的前缀和和2的后缀和 做1的前缀和和2的后缀和
那 我 们 枚 举 一 个 p o s , p o s 前 1 的 位 置 都 选 掉 , p o s 后 选 掉 所 有 2 那我们枚举一个pos,pos前1的位置都选掉,pos后选掉所有2 那我们枚举一个pos,pos前1的位置都选掉,pos后选掉所有2
那 么 接 下 来 就 是 在 p o s 前 挑 一 个 最 好 的 l 那么接下来就是在pos前挑一个最好的l 那么接下来就是在pos前挑一个最好的l
在 p o s 后 挑 一 个 最 好 的 r , 翻 转 [ l , r ] 即 可 在pos后挑一个最好的r,翻转[l,r]即可 在pos后挑一个最好的r,翻转[l,r]即可
那 么 [ l , p o s ) 的 2 会 翻 到 后 面 去 , ( p o s , r ] 的 1 会 翻 到 前 面 去 那么[l,pos)的2会翻到后面去,(pos,r]的1会翻到前面去 那么[l,pos)的2会翻到后面去,(pos,r]的1会翻到前面去
#include <bits/stdc++.h>
using namespace std;
const int maxn=2009;
int n,a[maxn];
int pre1[maxn],pre2[maxn];
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
pre1[i]=pre1[i-1]+(a[i]==1);
}
for(int i=n;i>=1;i--) pre2[i]=pre2[i+1]+(a[i]==2);
int ans=0;
for(int k=1;k<=n;k++)
{
int num1=0,num2=0;
for(int i=1;i<k;i++)
num1=max(num1,pre1[i]+pre2[i]-pre2[k]);//加上[i,k)中2的数量
for(int i=k+1;i<=n;i++)
num2=max(num2,pre2[i]+pre1[i]-pre1[k]);
ans=max(ans,num1+num2+1);
}
cout<<ans;
}