在思想的天空里自由翱翔。

Shift vs. CapsLock题解

Posted on 2023-05-28 19:32  rayhjfjwl  阅读(12)  评论(0)    收藏  举报  来源

题目传送门

题目大意:

 

 

AC code:

#include <iostream>
#include <cstring>
using namespace std;
#define int long long
int dp[300005][2];
//0代表小写,1代表大写 
signed main()
{
	int x,y,z;
	cin >> x >> y >> z;
	string s;
	cin >> s;
	if(s[0] == 'a')
	{
		dp[1][0] = x;
		dp[1][1] = min(x + z,y + z);
	}
	else
	{
		dp[1][0] = y;
		dp[1][1] = min(x +z,y + z);
	}
  	//第一个字符
	for(int i = 1;i < s.size();i++)
	{
		if(s[i] == 'a')
		{
			dp[i + 1][0] = min(dp[i][0] + x,dp[i][1] + min(z + x,z +y));
			dp[i + 1][1] = min(dp[i][0] + min(z + x,z + y),dp[i][1] + y); 
		}
		else
		{
			dp[i + 1][1] = min(dp[i][1] + x,dp[i][0] + z + min(x,y));
			dp[i + 1][0] = min(dp[i][1] + z + min(x,y),dp[i][0] + y); 
		}
	}
	int n = s.size();
	cout << min(dp[n][0],dp[n][1]);//找最优的
	return 0;
}