当前位置: 首页 > 工具软件 > twisty > 使用案例 >

A. A Twisty Movement(思维,枚举)

艾奕
2023-12-01

做 1 的 前 缀 和 和 2 的 后 缀 和 做1的前缀和和2的后缀和 12

那 我 们 枚 举 一 个 p o s , p o s 前 1 的 位 置 都 选 掉 , p o s 后 选 掉 所 有 2 那我们枚举一个pos,pos前1的位置都选掉,pos后选掉所有2 pos,pos1,pos2

那 么 接 下 来 就 是 在 p o s 前 挑 一 个 最 好 的 l 那么接下来就是在pos前挑一个最好的l posl

在 p o s 后 挑 一 个 最 好 的 r , 翻 转 [ l , r ] 即 可 在pos后挑一个最好的r,翻转[l,r]即可 posr,[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;
}
 类似资料: