特别注意:这一题是求的是子序列的长度,不是子串的长度
例子:
14
1 1 2 1 1 2 1 2 2 2 1 1 1 2
考虑答案的四种可能解:
1.什么都不翻转、只选其中序列中的1,那么就会有一个解,上述例子的是8个1,则第一种情况答案是8
2.考虑在第一种情况的基础上,在第一种情况的后面加上2,变成111..12,上述例子第二种情况答案是9
3.考虑在第二种情况的基础上,在第二种情况的后面加上1(这种情况是111…22..22,在其后面,加上一个1,变成111…22..221,可以翻转后面的2221,变成非递减),则第三种情况答案是11
4.考虑在第三种情况的基础上,在第三种情况的后面加上2(这种情况是111…22..111.1,在其后面,加上一个2,变成111…22..111.12,可以翻转后面的中间的22..111.1,变成非递减),则第四种情况答案是12
由于s3>s1,s4>s2,则ans=max(s3,s4)=12;
#include <iostream>
using namespace std;
int re[1000100];
int main()
{
std::ios::sync_with_stdio(false);
int n;cin>>n;
int s1=0,s2=0,s3=0,s4=0;
for(int i=1;i<=n;i++)
{
int x;cin>>x;
switch(x)
{
case 1:
s1++;
s3=max(s2+1,s3+1);
break;
case 2:
s2=max(s1+1,s2+1);
s4=max(s3+1,s4+1);
break;
}
}
cout<<max(s3,s4);
return 0;
}