codeforces 877B
题意:
给
定
一
串
字
符
串
,
只
含
‘
a
’
和
‘
b
’
,
你
需
要
在
不
改
变
字
符
顺
序
的
前
提
下
将
字
符
串
分
为
三
段
,
给定一串字符串,只含‘a’和‘b’,你需要在不改变字符顺序的前提下将字符串分为三段,
给定一串字符串,只含‘a’和‘b’,你需要在不改变字符顺序的前提下将字符串分为三段,
第
一
、
三
段
只
含
′
a
,
第
二
段
只
含
′
b
′
,
必
要
时
你
可
以
删
除
一
些
字
符
。
第一、三段只含'a,第二段只含'b',必要时你可以删除一些字符。
第一、三段只含′a,第二段只含′b′,必要时你可以删除一些字符。
问
满
足
条
件
的
最
大
字
符
串
长
度
。
问满足条件的最大字符串长度。
问满足条件的最大字符串长度。
题解:
d p [ i ] [ j ] 表 示 区 间 [ 1 , i ] 上 , 可 以 得 到 形 如 a a ( j = 0 ) 或 a b b ( j = 1 ) 或 a b a a ( j = 2 ) 的 最 大 字 符 串 长 度 。 dp[i][j]表示区间[1,i]上,可以得到形如aa(j=0)或abb(j=1)或abaa(j=2)的最大字符串长度。 dp[i][j]表示区间[1,i]上,可以得到形如aa(j=0)或abb(j=1)或abaa(j=2)的最大字符串长度。
- d p [ i + 1 ] [ 0 ] = d p [ i ] [ 0 ] + ( s [ i ] = = ′ a ′ ) dp[i+1][0] = dp[i][0]+(s[i] == 'a') dp[i+1][0]=dp[i][0]+(s[i]==′a′)
- d p [ i + 1 ] [ 1 ] = m a x ( d p [ i ] [ 0 ] , d p [ i ] [ 1 ] ) + ( s [ i ] = = ′ b ′ ) dp[i+1][1] = max(dp[i][0], dp[i][1])+(s[i] == 'b') dp[i+1][1]=max(dp[i][0],dp[i][1])+(s[i]==′b′)
- d p [ i + 1 ] [ 2 ] = m a x ( d p [ i ] [ 1 ] , d p [ i ] [ 2 ] ) + ( s [ i ] = = ′ a ′ ) dp[i+1][2] = max(dp[i][1], dp[i][2])+(s[i] == 'a') dp[i+1][2]=max(dp[i][1],dp[i][2])+(s[i]==′a′)
#include <bits\stdc++.h>
using namespace std;
const int N = 5001;
int dp[N][3];
int main() {
string s;
cin >> s;
int n = s.size();
for(int i = 0 ; i < n; i++)
{
dp[i+1][0] = dp[i][0]+(s[i] == 'a');
dp[i+1][1] = max(dp[i][0], dp[i][1])+(s[i] == 'b');
dp[i+1][2] = max(dp[i][1], dp[i][2])+(s[i] == 'a');
}
cout << max(dp[n][0], max(dp[n][1], dp[n][2])) << endl;
return 0;
}