Use this to learn the idea, then write your own version.
1 2class Solution:3 def minimumSum(self, grid: list[list[int]]) -> int:4 m = len(grid)5 n = len(grid[0])6 ans = m * n7 8 for i in range(m):9 top = self._minimumArea(grid, 0, i, 0, n - 1)10 for j in range(n):11 ans = min(ans, top +12 self._minimumArea(grid, i + 1, m - 1, 0, j) +13 self._minimumArea(grid, i + 1, m - 1, j + 1, n - 1))14 15 for i in range(m):16 bottom = self._minimumArea(grid, i, m - 1, 0, n - 1)17 for j in range(n):18 ans = min(ans, bottom +19 self._minimumArea(grid, 0, i - 1, 0, j) +20 self._minimumArea(grid, 0, i - 1, j + 1, n - 1))21 22 for j in range(n):23 left = self._minimumArea(grid, 0, m - 1, 0, j)24 for i in range(m):25 ans = min(ans, left +26 self._minimumArea(grid, 0, i, j + 1, n - 1) +27 self._minimumArea(grid, i + 1, m - 1, j + 1, n - 1))28 29 for j in range(n):30 right = self._minimumArea(grid, 0, m - 1, j, n - 1)31 for i in range(m):32 ans = min(ans, right +33 self._minimumArea(grid, 0, i, 0, j - 1) +34 self._minimumArea(grid, i + 1, m - 1, 0, j - 1))35 36 for i1 in range(m):37 for i2 in range(i1 + 1, m):38 ans = min(ans, self._minimumArea(grid, 0, i1, 0, n - 1) +39 self._minimumArea(grid, i1 + 1, i2, 0, n - 1) +40 self._minimumArea(grid, i2 + 1, m - 1, 0, n - 1))41 42 for j1 in range(n):43 for j2 in range(j1 + 1, n):44 ans = min(ans, self._minimumArea(grid, 0, m - 1, 0, j1) +45 self._minimumArea(grid, 0, m - 1, j1 + 1, j2) +46 self._minimumArea(grid, 0, m - 1, j2 + 1, n - 1))47 48 return ans49 50 def _minimumArea(51 self,52 grid: list[list[int]],53 si: int,54 ei: int,55 sj: int,56 ej: int,57 ) -> int:58 x1 = math.inf59 y1 = math.inf60 x2 = 061 y2 = 062 for i in range(si, ei + 1):63 for j in range(sj, ej + 1):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 return 0 if x1 == math.inf else (x2 - x1 + 1) * (y2 - y1 + 1)70