제출 #1286627

#제출 시각아이디문제언어결과실행 시간메모리
1286627mdobricNafta (COI15_nafta)C++20
0 / 100
2 ms1340 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2005; int r, s; char c[maxn][maxn]; int dp[maxn][maxn], suma[maxn][maxn], bio[maxn][maxn], ukp[maxn][maxn]; queue <pair <int, int> > q; int desno, val, lijevo; int pomakx[4] = {1, 0, 0, -1}; int pomaky[4] = {0, 1, -1, 0}; vector <int> pl[maxn], mi[maxn]; void bfs (){ while (!q.empty()){ int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; i++){ int novix = x + pomakx[i]; int noviy = y + pomaky[i]; if (novix >= 0 and novix < r and noviy >= 0 and noviy < s and bio[novix][noviy] == 0 and c[novix][noviy] != '.'){ q.push({novix, noviy}); if (noviy > desno) desno = noviy; if (noviy < lijevo) lijevo = noviy; val += c[novix][noviy] - '0'; bio[novix][noviy] = 1; } } } } void solve (int low, int high, int x, int y, int k){ if (low > high) return; int mid = (low + high) / 2; dp[mid][k] = -1; int opt; for (int i = x; i <= min(y, mid - 1); i++){ if (dp[i][k - 1] + suma[i][mid] > dp[mid][k]){ dp[mid][k] = dp[i][k - 1] + suma[i][mid]; opt = i; } } solve(low, mid - 1, x, opt, k); solve(mid + 1, high, opt, y, k); } int main (void){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> r >> s; for (int i = 0; i < r; i++){ for (int j = 0; j < s; j++){ cin >> c[i][j]; } } for (int i = 0; i < r; i++){ for (int j = 0; j < s; j++){ if (bio[i][j] == 0 and c[i][j] != '.'){ q.push({i, j}); bio[i][j] = 1; desno = j, lijevo = j, val = c[i][j] - '0'; bfs(); ukp[lijevo][desno] += val; pl[lijevo].push_back(val); mi[desno+1].push_back(val); } } } int tr = 0; for (int i = 0; i < s; i++){ for (int j = 0; j < pl[i].size(); j++) tr += pl[i][j]; for (int j = 0; j < mi[i].size(); j++) tr -= mi[i][j]; dp[i][1] = tr; } for (int i = s - 1; i >= 0; i--){ int dodaj = 0; for (int j = s - 1; j >= i + 1; j--){ dodaj += ukp[i+1][j]; suma[i][j] = suma[i + 1][j] + dodaj; //cout << i << " " << j << " " << suma[i][j] << endl; } } //cout << endl; int ans = 0; for (int i = 0; i < s; i++){ ans = max(ans, dp[i][1]); //cout << dp[i][1] << endl; } cout << ans << endl; for (int k = 2; k <= s; k++){ solve(0, s - 1, 0, s - 1, k); ans = 0; for (int i = 0; i < s; i++) ans = max(ans, dp[i][k]); cout << ans << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...