题解:AT_agc055_d [AGC055D] ABC Ultimatum
Union_of_Britain · · 题解
来点正推。
这和 AGC066C 有点像。先考虑一个串能否被划分。先来看看能不能判定划分为
我们来看看是否对
我们考虑向
例如
这样就了解了答案的结构:
只需判定每个箭头是否可分别实现。拿
同理有
那么直接 dp 记录这三者
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5,B=1e6,INF=1e8;
int g[maxn*3][3][2],f[maxn],n,T,a[maxn],s[maxn];
string str;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>str;n=str.size();
for(int i=1;i<=n;i++)a[i]=(str[i-1]=='B'?2:-1),s[i]=s[i-1]+a[i];a[n+1]=0;
for(int i=-n;i<=2*n;i++)for(int j:{0,1,2})for(int k:{0,1})g[i+B][j][k]=-INF;
f[0]=0;g[s[0]+B][0%3][a[1]==2]=0;int ans=0;
for(int i=1;i<=n;i++){
int j=a[i]==2;f[i]=f[i-1];
for(int k:{0,1})if(j||k)
f[i]=max(f[i],g[s[i]+B][i%3][k]+i);
g[s[i]+B][i%3][a[i+1]==2]=max(g[s[i]+B][i%3][a[i+1]==2],f[i]-i);
ans=max(ans,f[i]);
}
cout<<ans/3<<endl;
}
return 0;
}
写完才发现和 yzc001的题解 写的是一个过程。作为同样描述了正向推导的过程的题解,希望能给他几个点赞!