专栏文章
CF225C Barcode
CF225C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miow6j1z
- 此快照首次捕获于
- 2025/12/03 02:08 3 个月前
- 此快照最后确认于
- 2025/12/03 02:08 3 个月前
容易发现字符是如何在矩阵中分配的与答案无关,实际上只需要处理列与列之间的关系。
于是可以将问题抽象为:将一个长度为 的序列染成两种颜色,代价已知,且染色后的序列连续相同颜色的长度必须在 中,求最小代价。
问题转换为线性,染色的代价是显然的。
考虑 DP。
设 表示将第 位染成 ,到这一位已经连续 个颜色相同的最小代价。
状态转移方程:
同阶,时间复杂度 。
代码
CPPCI N = 1e3 + 5;
int n, m, x, y, ans = 1e9, dp[N][2][N], dis[2][N];
char ch[N][N];
signed main() {
n = read(), m = read(), x = read(), y = read();
rep(j, 1, n) arrin(ch[j], m + 1);
rep(j, 1, m) rep(i, 1, n) dis[0][j] += ch[i][j] == '.', dis[1][j] += ch[i][j] == '#';
mem(dp, 0x3f);
dp[1][0][1] = dis[0][1], dp[1][1][1] = dis[1][1];
rep(i, 2, m) rep(c, 0, 1) {
rep(j, x, y) dp[i][c][1] = std::min(dp[i][c][1], dis[c][i] + dp[i - 1][!c][j]);
rep(j, 2, y) dp[i][c][j] = dis[c][i] + dp[i - 1][c][j - 1];
}
rep(i, x, y) ans = std::min({ ans, dp[m][0][i], dp[m][1][i] });
print(ans);
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...