#include "bits/stdc++.h"
using namespace std;
const int N = 25;
char h[N][N], v[N][N];
int cntv, cnte, vis[N*N];
vector<int> path, cycle;
vector<int> adj[N*N];
void add_edge(int u, int v){
adj[u].push_back(v);
// cout<<u<<" "<<v<<endl;
}
void dfs(int nd){
vis[nd] = 1;
cntv += 1;
cnte += adj[nd].size();
for (auto to: adj[nd])
if (!vis[to])
dfs(to);
}
map<vector<int>, int> dp;
int rec(int p, int c, int rem, int what){
if (p == path.size() and c == cycle.size())
return rem;
if (dp.find({p, c, rem, what}) != dp.end())
return dp[{p, c, rem, what}];
int &ret=dp[{p, c, rem, what}];
ret = -1e9;
if (what == 0 and rem >= 4)//lastly marked cycle
ret = max(ret, rem-4 - rec(p, c, 4, -1));
if (what == 1 and rem >= 3)//lastly marked path
ret = max(ret, rem-2 - rec(p, c, 2, -1));
if (p < path.size())
ret = max(ret, rem - rec(p+1, c, path[p], 1));
if (c < cycle.size())
ret = max(ret, rem - rec(p, c+1, cycle[c], 0));
return ret;
}
int main(){
// freopen("file.in", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n+1; i++)
scanf("%s", h[i]);
for (int i = 0; i < n; i++)
scanf("%s", v[i]);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++){
int u = i*m+j;
if (i and h[i][j] == '0')
add_edge(u, u-m);
if (i + 1 < n and h[i+1][j] == '0')
add_edge(u, u+m);
if (j and v[i][j] == '0')
add_edge(u, u-1);
if (j + 1 < m and v[i][j+1] == '0')
add_edge(u, u+1);
if (h[i][j] == '1' and h[i+1][j] == '1' and
v[i][j] == '1' and v[i][j+1] == '1')
vis[u] = 1;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++){
int u = i*m+j;
if (vis[u])
continue;
cntv = cnte = 0;
dfs(u);
if (cntv * 2 > cnte)
path.push_back(cntv);
else
cycle.push_back(cntv);
}
sort(path.begin(), path.end());
sort(cycle.begin(), cycle.end());
// for (auto p: path)
// printf("%d ", p);
// puts("");
// for (auto c: cycle)
// printf("%d ", c);
// puts("");
printf("%d\n", rec(0, 0, 0, -1));
}
Compilation message (stderr)
game.cpp: In function 'int main()':
game.cpp:42:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
42 | scanf("%d%d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~
game.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
44 | scanf("%s", h[i]);
| ~~~~~^~~~~~~~~~~~
game.cpp:46:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
46 | scanf("%s", v[i]);
| ~~~~~^~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |