#include #include #include using namespace std; void transpose(vector>& g) { int r = g.size(); int c = g[0].size(); vector> ng(c); for(int i = 0; i < c; i++) { ng[i].resize(r); for(int j = 0; j < r; j++) ng[i][j] = g[j][i]; } g.swap(ng); } void genpsum(vector& dp, const vector& v) { dp.resize(v.size()+1); for(int i = 0; i < v.size(); i++) { dp[i+1] = dp[i] + (v[i] == '1'); } } int getops(vector& dp, int a, int b) { int zeroinside = (b-a+1) - (dp[b+1] - dp[a]); int oneoutside = dp[a] + (dp.back() - dp[b+1]); return zeroinside + oneoutside; } int main() { int r, c; cin >> r >> c; vector> g(r); for(auto& x: g) { x.resize(c); for(auto& y: x) cin >> y; } if(c > r) transpose(g); r = g.size(); c = g[0].size(); vector> dp(c); for(auto& x: dp) x.assign(c, 1e9); { vector psum; genpsum(psum, g[0]); for(int a = 0; a < c; a++) dp[0][a] = getops(psum, 0, a); } for(int i = 1; i < r; i++) { vector psum; genpsum(psum, g[i]); vector> ndp(c); for(auto& x: ndp) x.assign(c, 1e9); vector coldp(c, 1e9); for(int a = 0; a < c; a++) { for(int b = a; b < c; b++) coldp[b] = min(coldp[b], dp[a][b]); int best = coldp[a]; for(int b = a; b < c; b++) { best = min(best, coldp[b]); ndp[a][b] = best + getops(psum, a, b); } } dp.swap(ndp); } int ret = 1e9; for(int a = 0; a < c; a++) ret = min(ret, dp[a][c-1]); cout << ret << "\n"; }