제출 #1363944

#제출 시각아이디문제언어결과실행 시간메모리
1363944njoopNafta (COI15_nafta)C++20
34 / 100
1097 ms51548 KiB
#include <bits/stdc++.h>

using namespace std;

int sum, l, r, n, m;
vector<vector<char>> arr;
vector<vector<int>> vis, pre, dp;
vector<pair<int, int>> dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

void dfs(int cx, int cy) {
    l = min(l, cy);
    r = max(r, cy);
    if(arr[cx][cy] != '.') sum += arr[cx][cy] - '0';
    for(auto i: dir) {
        int nx = cx+i.first, ny = cy+i.second;
        if(nx < 0 || nx > n || ny < 0 || ny > m) continue;
        if(vis[nx][ny] || arr[nx][ny] == '.') continue;
        vis[nx][ny] = 1;
        dfs(nx, ny);
    }
}

int cost(int x, int y) {
    return pre[y][y] - pre[x-1][y];
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    arr.assign(n+2, vector<char>(m+2, '.'));
    vis.assign(n+2, vector<int>(m+2, 0));
    pre.assign(m+2, vector<int>(m+2, 0));
    dp.assign(m+2, vector<int>(m+2, 0));
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin >> arr[i][j];
        }
    }
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(vis[i][j] == 0 && arr[i][j] != '.') {
                l = j, r = j;
                sum = 0;
                vis[i][j] = 1;
                dfs(i, j);
                pre[l][r] += sum;
            }
        }
    }
    for(int i=1; i<=m; i++) {
        for(int j=1; j<=m; j++) {
            pre[i][j] += pre[i-1][j];
        }
    }
    for(int i=1; i<=m; i++) {
        for(int j=m; j>=1; j--) {
            pre[i][j] += pre[i][j+1];
        }
    }
    for(int k=1; k<=m; k++) {
        for(int i=k; i<=m; i++) {
            for(int j=k-1; j<i; j++) {
                dp[k][i] = max(dp[k][i], dp[k-1][j] + cost(j+1, i));
            }
        }
    }
    for(int i=1; i<=m; i++) {
        int ans = 0;
        for(int j=i; j<=m; j++) {
            ans = max(ans, dp[i][j]);
        }
        cout << ans << "\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…