제출 #1200205

#제출 시각아이디문제언어결과실행 시간메모리
1200205Ghulam_JunaidNafta (COI15_nafta)C++20
100 / 100
496 ms170344 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2005; int n, m, a[N][N]; ll dp[N][N], suff[N][N], pref[N][N]; char mat[N][N]; int dx[4] = {-1, 0, 1, 0}; int dy[4] = {0, 1, 0, -1}; int mx, sm; bool vis[N][N]; bool valid(int x, int y){ return (x > 0 and y > 0 and x <= n and y <= m and mat[x][y] != '.'); } void dfs(int x, int y){ vis[x][y] = 1; mx = max(mx, y); sm += mat[x][y] - '0'; for (int i = 0; i < 4; i ++){ int nx = x + dx[i]; int ny = y + dy[i]; if (!valid(nx, ny) or vis[nx][ny]) continue; dfs(nx, ny); } } void dnc(int j, int l, int r, int s, int e){ int mid = (l + r) / 2, opt = s; if (r < l or s >= mid) return; dp[mid][j] = dp[s][j - 1] + pref[mid][mid] - pref[s][mid]; for (int i = s + 1; i <= e and i < mid; i ++){ if (dp[i][j - 1] + pref[mid][mid] - pref[i][mid] > dp[mid][j]){ dp[mid][j] = dp[i][j - 1] + pref[mid][mid] - pref[i][mid]; opt = i; } } dnc(j, l, mid - 1, s, opt); dnc(j, mid + 1, r, opt, e); } int main(){ cin >> n >> m; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) cin >> mat[i][j]; for (int j = 1; j <= m; j ++){ for (int i = 1; i <= n; i ++){ if (vis[i][j] or mat[i][j] == '.') continue; mx = j, sm = 0; dfs(i, j); a[j][mx] += sm; } } for (int i = 1; i <= m; i ++) for (int j = m; j >= i; j --) suff[i][j] = suff[i][j + 1] + a[i][j]; for (int i = 1; i <= m; i ++) for (int l = 1; l <= i; l ++) pref[l][i] = pref[l - 1][i] + suff[l][i]; for (int j = 1; j <= m; j ++){ dnc(j, 1, m, 0, m); for (int i = 1; i <= m; i ++) dp[i][j] = max(dp[i][j], dp[i - 1][j]); } for (int k = 1; k <= m; k ++) cout << dp[m][k] << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...