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';
}
posted @ 2025-08-12 09:57  _Yxc  阅读(5)  评论(0)    收藏  举报