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';
}