专栏文章
题解:P14294 [JOI2024 预选赛 R2] 白色灯 2 / White Light 2
P14294题解参与者 4已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @minj7rtf
- 此快照首次捕获于
- 2025/12/02 03:18 3 个月前
- 此快照最后确认于
- 2025/12/02 03:18 3 个月前
给出一个只含有 的字符串 ,你可以执行任意次以下操作:
- 把第一个字符删去,代价为 。
- 把最后一个字符删去,代价为 。
- 修改任意一个字符,代价为 。
你需要使操作后的字符串 满足以下任意一种要求:
- ;
- 且 。
。
显然动态规划。先不考虑第二种操作。
令 为只考虑前 个字符,处理后末尾字符为 的最小代价。
显然我们有
其中 是代价增量函数,。
加入第二种操作,答案就是 和 的较小值。
时间复杂度 ,空间复杂度 。
代码
CPPvoid solve() {
i64 n, a, b, c, ans = inf64;
std::string s;
std::cin >> n >> s >> a >> b >> c, s = ' ' + s;
std::vector f(2, std::vector(5, inf64));
// 0 = NULL, 1 = R, 2 = G, 3 = B;
f[0][0] = 0;
ans = n * b;
for (i32 i = 1; i <= n; i++) {
std::fill(f[i & 1].begin(), f[i & 1].end(), inf64);
f[i & 1][0] = f[i & 1 ^ 1][0] + a;
f[i & 1][1] = std::min(f[i & 1 ^ 1][0] + c * (s[i] != 'R'), f[i & 1][1]);
f[i & 1][1] = std::min(f[i & 1 ^ 1][3] + c * (s[i] != 'R'), f[i & 1][1]);
f[i & 1][2] = std::min(f[i & 1 ^ 1][1] + c * (s[i] != 'G'), f[i & 1][2]);
f[i & 1][3] = std::min(f[i & 1 ^ 1][2] + c * (s[i] != 'B'), f[i & 1][3]);
ans = std::min({ans, f[i & 1][3] + (n - i) * b, f[i & 1][0] + (n - i) * b});
}
std::cout << ans << endl;
return void();
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...