1 条题解
-
0
首先,一定存在一种最优策略,其 01 反转的这一段被最终的最长交替序列完全包含。因为如果有不包含的地方,把这些去掉不参与反转,剩下的段仍然是连续的且不会缩短最终的长度。因此,只需要考虑反转的这一段被最终的最长交替序列完全包含的情况。
由于这一段被一个交替序列完整包含,因此它本身就是一段交替序列。
接着,会发现,对于两个符合以上条件的反转方案,如果其中一个反转区间完全包含了另一个,那么前者一定是更优的,因为它们反转后都是符合要求的交替序列,而前者更长。
因此,可以找出原序列的所有极大交替序列,然后一一枚举将它们反转后会出现多长的交替序列,最终取最大值即可。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; bool a[N]; int arr[N]; int main(){ ios::sync_with_stdio(0);cin.tie(0); int n;cin>>n; int l=0; int lst=1; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=2;i<=n;i++){ if(a[i]==a[i-1]){ //下一段交替序列 arr[++l]=i-lst; lst=i; } } arr[++l]=n+1-lst; int ans=-1; for(int i=1;i<=l;i++){ ans=max(ans,arr[i-1]+arr[i]+arr[i+1]); } cout<<ans; return 0; }
- 1
信息
- ID
- 9001
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者