题意: 解法: 这题O(n^2)的暴力也能过,不过我这里用一种O(n)的dp解法: 由于要分成三个连续集合,令d[i][j=0/1/2]为前i个数,第i个数当前到达第j个集合的最大长度. 转移方程显而易见: d[i][j]可以从d[i-1][k]转移得来,其中k<=j. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=2e5+5; int d[maxm][3]; char s[maxm]; int n; void solve(){ cin>>(s+1); n=strlen(s+1); for(int i=1;i<=n;i++){ d[i][0]=d[i-1][0]+(s[i]=='a'); // d[i][1]=d[i-1][1]+(s[i]=='b'); d[i][1]=max(d[i][1],d[i-1][0]+(s[i]=='b')); // d[i][2]=d[i-1][2]+(s[i]=='a'); d[i][2]=max(d[i][2],d[i-1][1]+(s[i]=='a')); d[i][2]=max(d[i][2],d[i-1][0]+(s[i]=='a')); // } //由于集合可空,因此要对三者取max int ans=max({d[n][0],d[n][1],d[n][2]}); cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }