#include <bits/stdc++.h>
using namespace std;
#define int long long
#define arr array
#define vec vector
#define pii pair<int, int>
#define fir first
#define sec second
const int R = 2e3 + 5, C = 2e3 + 5, INF = 1e18;
int r, c;
arr<arr<int, C>, R> a;
int nm_cls;
arr<arr<int, C>, R> cl;
arr<int, R * C> vl;
arr<pii, R * C> rng;
void dfs(int i, int j) {
cl[i][j] = nm_cls, vl[nm_cls] += a[i][j];
rng[nm_cls].fir = min(rng[nm_cls].fir, j), rng[nm_cls].sec = max(rng[nm_cls].sec, j);
vec<pii> adj = {{i - 1, j}, {i + 1, j}, {i, j - 1}, {i, j + 1}};
for (pii x : adj) {
if (x.fir < 1 || x.fir > r || x.sec < 1 || x.sec > c) continue;
if (a[x.fir][x.sec] == -1) continue;
if (cl[x.fir][x.sec]) continue;
dfs(x.fir, x.sec);
}
}
arr<arr<int, C>, C> cst;
int cst_qry(int l, int r) {
if (l > r) return 0;
return cst[r][r] - cst[l - 1][r] - cst[r][l - 1] + cst[l - 1][l - 1];
}
void cst_cmp() {
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if (a[i][j] != -1 && !cl[i][j])
rng[++nm_cls] = {j, j}, dfs(i, j), cst[rng[nm_cls].fir][rng[nm_cls].sec] += vl[nm_cls];
for (int i = 1; i <= c; i++)
for (int j = 1; j <= c; j++)
cst[i][j] = cst[i - 1][j] + cst[i][j - 1] - cst[i - 1][j - 1] + cst[i][j];
// for (int i = 1; i <= nm_cls; i++) cout << rng[i].fir << " " << rng[i].sec << '\n';
}
arr<arr<int, C>, C> dp;
void dp_cmp() {
for (int i = 1; i <= c; i++) dp[i][1] = cst_qry(1, i - 1);
for (int k = 2; k <= c; k++) {
for (int i = 1; i <= c; i++) {
dp[i][k] = INF;
for (int j = 1; j <= i; j++)
dp[i][k] = min(dp[i][k], dp[j - 1][k - 1] + cst_qry(j, i - 1));
// cout << k << " " << i << ": " << dp[i][k] << '\n';
}
}
}
signed main() {
// freopen("in", "r", stdin);
cin.sync_with_stdio(false), cin.tie(0);
cin >> r >> c;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
char x; cin >> x;
a[i][j] = (x == '.') ? -1 : x - '0';
}
}
cst_cmp();
dp_cmp();
int whl = 0;
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if (a[i][j] != -1) whl += a[i][j];
for (int k = 1; k <= c; k++) {
int ans = INF;
for (int i = 1; i <= c; i++) ans = min(ans, dp[i][k] + cst_qry(i + 1, c));
ans = whl - ans;
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |