CF2225C 题解
传送门:洛谷 CF2225C Red-Black Pairs | Codeforces C. Red-Black Pairs
更佳的阅读体验:CF2225C 题解
简要题意:给你一个
只有两行,所以所有可能的匹配方式就只有两种,也就是横着或者竖着的两格。匹配时如果这两格的颜色不相同,就产生
此时问题变成了,我们需要找到一种匹配方式,使得所有格子都被匹配且代价最小。
考虑 DP。我们定义
我们可以提前预处理出竖着匹配和横着匹配的代价
其中
于是我们就得到了转移方程。
时间复杂度
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10, M = 5;
int t, n, f[N], cost[M][N];
char c[M][N];
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
for (cin >> t; t; --t) {
fill(f + 1, f + n + 1, 0);
fill(cost[1] + 1, cost[1] + n + 1, 0);
fill(cost[2] + 1, cost[2] + n + 1, 0);
cin >> n >> c[1] + 1 >> c[2] + 1;
for (int i = 1; i <= n; ++i) {
cost[1][i] = c[1][i] != c[2][i];
cost[2][i] = (c[1][i] != c[1][i + 1]) + (c[2][i] != c[2][i + 1]);
} f[1] = cost[1][1];
for (int i = 2; i <= n; ++i)
f[i] = min(f[i - 1] + cost[1][i], f[i - 2] + cost[2][i - 1]);
cout << f[n] << '\n';
} return 0;
}