题意:长度为n的序列a,序列a只包含数字1和数字2.
n<=2000., 翻转一个区间[L,R]后,问序列a的最长非递减子序列的长度.
因为序列a只有1和2,LIS子序列为11112222形式.
那么翻转之前,最优的子序列也就是 11122211122 这种形式.
要么等价于在序列a中找到最长的1*2*1*2*子序列.
n<=2000., 翻转一个区间[L,R]后,问序列a的最长非递减子序列的长度.
因为序列a只有1和2,LIS子序列为11112222形式.
那么翻转之前,最优的子序列也就是 11122211122 这种形式.
要么等价于在序列a中找到最长的1*2*1*2*子序列.
设d[0,1,2,3] 分别表示为1, 12,121,1212形式的最长子序列即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
int n,a[N],d[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int res=0;
for(int i=1;i<=n;i++)
{
d[3]=max(d[3],d[2])+(a[i]==2);
d[2]=max(d[2],d[1])+(a[i]==1);
d[1]=max(d[1],d[0])+(a[i]==2);//(null,1)+2
d[0]=d[0]+(a[i]==1);
res=max(res,max(d[3],d[2]));
}
cout<<res<<endl;
return 0;
}