Atcoder - Range Flip Find Route
题解
考虑任意一条从点\(S\)到点\(T\)的路径\(path\),如果\(path\)含有\(t\)个连续的'#'块,那么这条路径就需要\(t\)次操作。举例 (B代表#):
\[BWBWBBW
\]
一次操作是针对一个矩形区域,所以任意一条路径都可以拉直来看
这条路径有3个分别连续的'#’块
所以答案就是求所有路径中最小的\(t\)值。
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) cin >> maps[i][j];
for (int i = 0; i <= 100; ++i) dp[i][0] = dp[0][i] = INF;
dp[0][1] = dp[1][0] = 0;
for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) {
if (maps[i][j] == '#') {
dp[i][j] = min(dp[i - 1][j] + (maps[i][j] != maps[i - 1][j]), dp[i][j - 1] + (maps[i][j] != maps[i][j - 1]));
}
else {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]);
}
}
/*
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) cout << dp[i][j] << " ";
cout << endl;
}
*/
cout << dp[n][m] << endl;
return 0;
}