G. ABBC or BACB
https://codeforces.com/problemset/problem/1873/G
题意:给定长度为n的字符串s,s包含A和B,AB可变换为BC,加一分。BA可变换为CB,加一分,问最多加多少分。
思路:动态规划,考虑每个B往前变或者往后变的分值,用dp[i][0]和dp[i][1]表示。dp[i][0] = dp[i][0] + dp[i - 1][0],
dp[i][1] += max(dp[i - 1][0], dp[i - 1][1])
总结:一开始没发现这个操作有什么特性,感觉好像是贪心的解法,后面看了题解的第一段才发现,这个B可以当作一个吃A的东西,可以往左吃,也可以往右吃,然后依次考虑每个B吃的最大分值就行了。
inline void solve() {
string s;
cin >> s;
int n = (int)s.size();
vector<int> p;
for (int i = 0; i < n; ++i) {
if (s[i] == 'B') {
p.push_back(i);
}
}
if (p.empty()) {
cout << "0\n";
return;
}
int m = (int)p.size();
vector<array<int, 2>> dp(m);
for (int i = 0; i < m; ++i) {
int cnt = 0;
for (int j = p[i] - 1; j >= 0 && s[j] == 'A'; --j) {
cnt ++;
}
dp[i][0] = cnt;
if (i) {
dp[i][0] += dp[i - 1][0];
dp[i][0] = max(dp[i][0], dp[i - 1][1]);
}
cnt = 0;
for (int j = p[i] + 1; j < n && s[j] == 'A'; ++j) {
cnt ++;
}
dp[i][1] = cnt;
if (i) {
dp[i][1] += max(dp[i - 1][0], dp[i - 1][1]);
}
}
cout << max(dp[m - 1][0], dp[m - 1][1]) << '\n';
}

浙公网安备 33010602011771号