[ABC303D] Shift vs. CapsLock

考虑 DP。

fi,0/1f_{i,0/1} 表示当前打完了第 ii 个字母,且 Capslock 现在处于开启或关闭时的代价最小值。

于是可以进行线性 DP。

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;
long long dp[N][2];

int main()
{
	long long x, y, z;
	scanf("%lld%lld%lld", &x, &y, &z);
	string s;
	cin >> s;
	for (int i = 0; i < N; i++) dp[i][0] = dp[i][1] = 1e15;
	dp[0][0] = 0;
	dp[0][1] = z; 
	for (int i = 1; i <= s.size(); i++)
	{
		char c = s[i - 1];
		if (c == 'a')
		{
			dp[i][0] = min(dp[i - 1][0] + min(x, z + y + z), dp[i - 1][1] + min(z + x, y + z));
			dp[i][1] = min(dp[i - 1][0] + min(x + z, z + y), dp[i - 1][1] + min(y, z + x + z));
		}
		else
		{
			dp[i][0] = min(dp[i - 1][0] + min(y, z + x + z), dp[i - 1][1] + min(x + z, z + y));
			dp[i][1] = min(dp[i - 1][0] + min(y + z, z + x), dp[i - 1][1] + min(x, z + y + z));
		}
	}
	printf("%lld\n", min(dp[s.size()][0], dp[s.size()][1]));
	return 0;
}
posted @ 2023-05-28 16:31  HappyBobb  阅读(11)  评论(0)    收藏  举报  来源