CF225C 题解
思路
表示第 列中 . 的个数(此处不是 #,因为全改成 # 需要修改 . 的个数的代价), 表示第 列中 # 的个数, 表示最后一列是第 列且最后一列选了 ,已经连续相同了 列时的最小代价( 表示 #, 表示 .)。 可以从 转移过来, 可以从 转移过来。最终结果就是 。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, m, l, r, dp[1005][1005][2], a[1005][2], minx = 1e9;
string s;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n >> m >> l >> r;
for (int i = 0; i < n; ++ i) {
cin >> s;
for (int j = 0; j < m;)
if (s[j] ^ '#')
++ a[++ j][0];
else
++ a[++ j][1];
}
memset (dp, 0x3f, sizeof dp);
dp[0][0][0] = dp[0][0][1] = 0;
for (int i = 1; i <= m; ++ i) {
for (int j = l; j <= r; ++ j)
for (int k = 0; k < 2; ++ k)
dp[i][1][k] = min (dp[i][1][k], dp[i - 1][j][! k] + a[i][k]);
for (int j = 1; j <= r; ++ j)
for (int k = 0; k < 2; ++ k)
dp[i][j][k] = min (dp[i][j][k], dp[i - 1][j - 1][k] + a[i][k]);
}
for (int j = l; j <= r; ++ j)
for (int k = 0; k < 2; ++ k)
minx = min (minx, dp[m][j][k]);
cout << minx;
return 0;
}

浙公网安备 33010602011771号