CF1873G ABBC or BACB 题解
为什么没有人用 DP?来水一发 DP 题解。
典型的线性 DP,先来考虑两个特殊情况:AAAB 和 BAAA。
第一个情况可以变为 BCCC,获得 CCCB,获得
我们可以通过遍历一遍字符串确定每一组连续的
先建立一个 DP 数组
随后分类讨论进行转移。
当第 AB,即可获得
当第 BA,由于
当 BA,表示上一次操作后可再进行一次操作,因此由
最后的答案为
代码实现
#include<bits/stdc++.h>
using namespace std;
#define I_love_Foccarus return
#define rep(i,a,b) for(int i=a;i<=b;i++)
//#define int long long
const int N = 2e5 + 5;
void fast() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
string a;
int dp[N][2] , l[N];
char c;
signed main(){
fast();
int t;
cin>>t;
while(t--){
memset(dp , 0, sizeof(dp));
cin>>a;
int len = a.size();
a = " " + a;
l[0] = 1;
for(int i = 1 ; i <= len ; i++) l[i] = a[i] == 'A' ? l[i - 1] : i + 1;
c = a[0];
for(int i = 2 ; i <= len ; i++){
if(a[i - 1] == 'A' && a[i] == 'B'){
dp[i][1] = max(dp[l[i - 1] - 1][1] , dp[l[i - 1] - 1][0]) + i - l[i - 1];
c = 'C';
}else if(a[i - 1] == 'B' && a[i] == 'A'){
dp[i][1] = dp[i - 1][0] + 1;
c = 'B';
}else if(c == 'B' && a[i] == 'A'){
dp[i][1] = dp[i - 1][1] + 1;
c = 'B';
}
dp[i][0] = max(dp[i - 1][0] , dp[i - 1][1]);
}
cout<<max(dp[len][0] , dp[len][1])<<'\n';
}
I_love_Foccarus 0;
}