|
| 1 | +public class Solution { |
| 2 | + private const int INF = 1 << 30; |
| 3 | + private int[][] grid; |
| 4 | + |
| 5 | + public int MinimumSum(int[][] grid) { |
| 6 | + this.grid = grid; |
| 7 | + int m = grid.Length; |
| 8 | + int n = grid[0].Length; |
| 9 | + int ans = m * n; |
| 10 | + |
| 11 | + for (int i1 = 0; i1 < m - 1; i1++) { |
| 12 | + for (int i2 = i1 + 1; i2 < m - 1; i2++) { |
| 13 | + ans = Math.Min( |
| 14 | + ans, F(0, 0, i1, n - 1) + F(i1 + 1, 0, i2, n - 1) + F(i2 + 1, 0, m - 1, n - 1)); |
| 15 | + } |
| 16 | + } |
| 17 | + |
| 18 | + for (int j1 = 0; j1 < n - 1; j1++) { |
| 19 | + for (int j2 = j1 + 1; j2 < n - 1; j2++) { |
| 20 | + ans = Math.Min( |
| 21 | + ans, F(0, 0, m - 1, j1) + F(0, j1 + 1, m - 1, j2) + F(0, j2 + 1, m - 1, n - 1)); |
| 22 | + } |
| 23 | + } |
| 24 | + |
| 25 | + for (int i = 0; i < m - 1; i++) { |
| 26 | + for (int j = 0; j < n - 1; j++) { |
| 27 | + ans = Math.Min( |
| 28 | + ans, F(0, 0, i, j) + F(0, j + 1, i, n - 1) + F(i + 1, 0, m - 1, n - 1)); |
| 29 | + ans = Math.Min( |
| 30 | + ans, F(0, 0, i, n - 1) + F(i + 1, 0, m - 1, j) + F(i + 1, j + 1, m - 1, n - 1)); |
| 31 | + |
| 32 | + ans = Math.Min( |
| 33 | + ans, F(0, 0, i, j) + F(i + 1, 0, m - 1, j) + F(0, j + 1, m - 1, n - 1)); |
| 34 | + ans = Math.Min( |
| 35 | + ans, F(0, 0, m - 1, j) + F(0, j + 1, i, n - 1) + F(i + 1, j + 1, m - 1, n - 1)); |
| 36 | + } |
| 37 | + } |
| 38 | + return ans; |
| 39 | + } |
| 40 | + |
| 41 | + private int F(int i1, int j1, int i2, int j2) { |
| 42 | + int x1 = INF, y1 = INF; |
| 43 | + int x2 = -INF, y2 = -INF; |
| 44 | + for (int i = i1; i <= i2; i++) { |
| 45 | + for (int j = j1; j <= j2; j++) { |
| 46 | + if (grid[i][j] == 1) { |
| 47 | + x1 = Math.Min(x1, i); |
| 48 | + y1 = Math.Min(y1, j); |
| 49 | + x2 = Math.Max(x2, i); |
| 50 | + y2 = Math.Max(y2, j); |
| 51 | + } |
| 52 | + } |
| 53 | + } |
| 54 | + return (x2 - x1 + 1) * (y2 - y1 + 1); |
| 55 | + } |
| 56 | +} |
0 commit comments