萌新刚学 OI。昨晚 ABC 的 D dp 求调。
  • 板块学术版
  • 楼主Loser_Syx
  • 当前回复43
  • 已保存回复43
  • 发布时间2023/5/28 06:36
  • 上次更新2023/10/23 14:31:43
查看原帖
萌新刚学 OI。昨晚 ABC 的 D dp 求调。
852144
Loser_Syx楼主2023/5/28 06:36

WA 了 4 个 点

#include <bits/stdc++.h>
using namespace std;
#define int long long
unsigned long long dp[301010][4];
char tp[301010][4];
signed main(){
	for(int i = 1; i <= 300100; ++i) for(int j = 0; j < 4; ++j) dp[i][j] = 4e18, tp[i][j] = '~';
	int x, y, z;
	scanf("%lld%lld%lld", &x, &y, &z);
	char s[305001];
	scanf("%s", s);
	int len = strlen(s);
	tp[0][0] = tp[0][1] = tp[0][2] = 'a';
	for(int i = 0; i < len; ++i){
		if(s[i] == tp[i][0]){
			tp[i+1][0] = s[i];
			dp[i+1][0] = min(dp[i][0] + x, dp[i+1][0]);
		}else if(tp[i][0] == 'A' || tp[i][0] == 'a'){
			tp[i+1][1] = tp[i][0];
			dp[i+1][1] = min(dp[i][0] + y, dp[i+1][1]);
			tp[i+1][2] = s[i];
			dp[i+1][2] = min(dp[i][0] + x + z, dp[i+1][2]);
		}
		if(s[i] == tp[i][1]){
			tp[i+1][0] = s[i];
			dp[i+1][0] = min(dp[i][1] + x, dp[i+1][0]);
		}else if(tp[i][1] == 'A' || tp[i][1] == 'a'){
			tp[i+1][1] = tp[i][1];
			dp[i+1][1] = min(dp[i][1] + y, dp[i+1][1]);
			tp[i+1][2] = s[i];
			dp[i+1][2] = min(dp[i][1] + x + z, dp[i+1][2]);
		}
		if(s[i] == tp[i][2]){
			tp[i+1][0] = s[i];
			dp[i+1][0] = min(dp[i][2] + x, dp[i+1][0]);
		}else if(tp[i][2] == 'A' || tp[i][2] == 'a'){
			tp[i+1][1] = tp[i][2];
			dp[i+1][1] = min(dp[i][2] + y, dp[i+1][1]);
			tp[i+1][2] = s[i];
			dp[i+1][2] = min(dp[i][2] + x + z, dp[i+1][2]);
		}
	}
	printf("%llu\n", min({dp[len][0], dp[len][1], dp[len][2]}));
	return 0;
}
2023/5/28 06:36
加载中...