Use this to learn the idea, then write your own version.
1class Solution {2 public:3 int minimumSum(vector<vector<int>>& grid) {4 const int m = grid.size();5 const int n = grid[0].size();6 int ans = m * n;7 8 for (int i = 0; i < m; ++i) {9 const int top = minimumArea(grid, 0, i, 0, n - 1);10 for (int j = 0; j < n; ++j)11 ans = min(ans,12 top + minimumArea(grid, i + 1, m - 1, 0, j) +13 minimumArea(grid, i + 1, m - 1, j + 1, n - 1));14 }15 16 for (int i = 0; i < m; ++i) {17 const int bottom = minimumArea(grid, i, m - 1, 0, n - 1);18 for (int j = 0; j < n; ++j)19 ans = min(ans, bottom + minimumArea(grid, 0, i - 1, 0, j) +20 minimumArea(grid, 0, i - 1, j + 1, n - 1));21 }22 23 for (int j = 0; j < n; ++j) {24 const int left = minimumArea(grid, 0, m - 1, 0, j);25 for (int i = 0; i < m; ++i)26 ans = min(ans,27 left + minimumArea(grid, 0, i, j + 1, n - 1) +28 minimumArea(grid, i + 1, m - 1, j + 1, n - 1));29 }30 31 for (int j = 0; j < n; ++j) {32 const int right = minimumArea(grid, 0, m - 1, j, n - 1);33 for (int i = 0; i < m; ++i)34 ans =35 min(ans, right + minimumArea(grid, 0, i, 0, j - 1) +36 minimumArea(grid, i + 1, m - 1, 0, j - 1));37 }38 39 for (int i1 = 0; i1 < m; ++i1)40 for (int i2 = i1 + 1; i2 < m; ++i2)41 ans =42 min(ans, minimumArea(grid, 0, i1, 0, n - 1) +43 minimumArea(grid, i1 + 1, i2, 0, n - 1) +44 minimumArea(grid, i2 + 1, m - 1, 0, n - 1));45 46 for (int j1 = 0; j1 < n; ++j1)47 for (int j2 = j1 + 1; j2 < n; ++j2)48 ans =49 min(ans, minimumArea(grid, 0, m - 1, 0, j1) +50 minimumArea(grid, 0, m - 1, j1 + 1, j2) +51 minimumArea(grid, 0, m - 1, j2 + 1, n - 1));52 53 return ans;54 }55 56 private:57 int minimumArea(vector<vector<int>>& grid, int si, int ei, int sj, int ej) {58 int x1 = INT_MAX;59 int y1 = INT_MAX;60 int x2 = 0;61 int y2 = 0;62 for (int i = si; i <= ei; ++i)63 for (int j = sj; j <= ej; ++j)64 if (grid[i][j] == 1) {65 x1 = min(x1, i);66 y1 = min(y1, j);67 x2 = max(x2, i);68 y2 = max(y2, j);69 }70 return x1 == INT_MAX ? 0 : (x2 - x1 + 1) * (y2 - y1 + 1);71 }72};73