Submission #1223318

#TimeUsernameProblemLanguageResultExecution timeMemory
1223318overwatch9Selotejp (COCI20_selotejp)C++20
110 / 110
192 ms156640 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1001; const int maxm = 11; int dp[maxn][maxm][(1 << maxm)][2]; bool ready[maxn][maxm][(1 << maxm)][2]; vector <string> grid; int n, m; // dp[i][j][mask][is the last square covered by a piece of horizontal tape or not] // in mask: 1 is if the square is covered by vertical tape // in mask: 0 is if the square is not covered by vertical tape int solve(int i, int j, int mask, bool horizontal) { if (i >= n) return 0; if (ready[i][j][mask][horizontal]) return dp[i][j][mask][horizontal]; int ans = 1e9; if (grid[i][j] == '#') { // closed window int mask2 = mask; if (horizontal) { // continue the horizontal tape mask2 = (mask2 << 1); mask2 &= ((1 << m) - 1); if (j+1 < m) ans = min(ans, solve(i, j+1, mask2, true)); else ans = min(ans, solve(i+1, 0, mask2, false)); } // see if the vertical piece can be continued mask2 = mask; mask2 = (mask2 << 1); if (mask2 & (1 << m)) { mask2 &= ((1 << m) - 1); mask2++; if (j+1 < m) ans = min(ans, solve(i, j+1, mask2, false)); else ans = min(ans, solve(i+1, 0, mask2, false)); } // start a vertical piece mask2 = mask; mask2 = (mask2 << 1); mask2 &= ((1 << m) - 1); mask2++; if (j+1 < m) ans = min(ans, solve(i, j+1, mask2, false) + 1); else ans = min(ans, solve(i+1, 0, mask2, false) + 1); // start a horizontal piece mask2 = mask; mask2 = (mask2 << 1); mask2 &= ((1 << m) - 1); if (j+1 < m) ans = min(ans, solve(i, j+1, mask2, true) + 1); else ans = min(ans, solve(i+1, 0, mask2, false) + 1); } else { // open window int mask2 = mask; mask2 = (mask2 << 1); mask2 &= ((1 << m) - 1); if (j+1 < m) ans = min(ans, solve(i, j+1, mask2, false)); else ans = min(ans, solve(i+1, 0, mask2, false)); } dp[i][j][mask][horizontal] = ans; ready[i][j][mask][horizontal] = true; return ans; } int main() { cin >> n >> m; grid.resize(n+1); for (int i = 0; i < n; i++) cin >> grid[i]; cout << solve(0, 0, 0, 0) << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...