Test2
<p>public static int maxSumTwoSubgrids(int[][] grid) {</p>
<p> int N = grid.length;</p>
<p> int maxSum = Integer.MIN_VALUE;</p>
<p> </p>
<p> // Precompute the sums of all possible subgrids</p>
<p> int[][] subgridSums = new int[N + 1][N + 1];</p>
<p> for (int i = 0; i < N; i++) {</p>
<p> for (int j = 0; j < N; j++) {</p>
<p> subgridSums[i + 1][j + 1] = grid[i][j] + subgridSums[i][j + 1] + subgridSums[i + 1][j] - subgridSums[i][j];</p>
<p> }</p>
<p> }</p>
<p> </p>
<p> // Helper function to get sum of subgrid</p>
<p> int getSum(int x1, int y1, int x2, int y2) {</p>
<p> return subgridSums[x2 + 1][y2 + 1] - subgridSums[x1][y2 + 1] - subgridSums[x2 + 1][y1] + subgridSums[x1][y1];</p>
<p> }</p>
<p> </p>
<p> // Iterate over all possible sizes of the first subgrid</p>
<p> for (int size1 = 1; size1 <= N; size1++) {</p>
<p> for (int x1 = 0; x1 <= N - size1; x1++) {</p>
<p> for (int y1 = 0; y1 <= N - size1; y1++) {</p>
<p> int sum1 = getSum(x1, y1, x1 + size1 - 1, y1 + size1 - 1);</p>
<p> </p>
<p> // Mark rows and columns used by the first subgrid</p>
<p> Set<Integer> rowsUsed = new HashSet<>();</p>
<p> Set<Integer> colsUsed = new HashSet<>();</p>
<p> for (int i = x1; i < x1 + size1; i++) rowsUsed.add(i);</p>
<p> for (int j = y1; j < y1 + size1; j++) colsUsed.add(j);</p>
<p> </p>
<p> // Iterate over all possible sizes of the second subgrid</p>
<p> for (int size2 = 1; size2 <= N; size2++) {</p>
<p> for (int x2 = 0; x2 <= N - size2; x2++) {</p>
<p> for (int y2 = 0; y2 <= N - size2; y2++) {</p>
<p> // Check if the second subgrid intersects with the first</p>
<p> boolean intersects = false;</p>
<p> for (int i = x2; i < x2 + size2; i++) {</p>
<p> if (rowsUsed.contains(i)) {</p>
<p> intersects = true;</p>
<p> break;</p>
<p> }</p>
<p> }</p>
<p> if (!intersects) {</p>
<p> for (int j = y2; j < y2 + size2; j++) {</p>
<p> if (colsUsed.contains(j)) {</p>
<p> intersects = true;</p>
<p> break;</p>
<p> }</p>
<p> }</p>
<p> }</p>
<p> if (intersects) continue;</p>
<p> </p>
<p> int sum2 = getSum(x2, y2, x2 + size2 - 1, y2 + size2 - 1);</p>
<p> maxSum = Math.max(maxSum, sum1 + sum2);</p>
<p> }</p>
<p> }</p>
<p> }</p>
<p> }</p>
<p> }</p>
<p> }</p>
<p> </p>
<p> return maxSum;</p>
<p> }</p>
<p> </p>
<p>--------------- V2</p>
<p>private static int getSum(int[][] subgridSums, int x1, int y1, int x2, int y2) {<br />
return subgridSums[x2 + 1][y2 + 1] - subgridSums[x1][y2 + 1] - subgridSums[x2 + 1][y1] + subgridSums[x1][y1];<br />
}</p>
<p>------------------- V3</p>
<p>public static int maxSumTwoSubgrids(int[][] grid) {<br />
int N = grid.length;<br />
int maxSum = Integer.MIN_VALUE;</p>
<p> // Precompute the sums of all possible subgrids<br />
int[][] subgridSums = new int[N + 1][N + 1];<br />
for (int i = 0; i < N; i++) {<br />
for (int j = 0; j < N; j++) {<br />
subgridSums[i + 1][j + 1] = grid[i][j] + subgridSums[i][j + 1] + subgridSums[i + 1][j] - subgridSums[i][j];<br />
}<br />
}</p>
<p> // Iterate over all possible sizes of the first subgrid<br />
for (int size1 = 1; size1 <= N; size1++) {<br />
for (int x1 = 0; x1 <= N - size1; x1++) {<br />
for (int y1 = 0; y1 <= N - size1; y1++) {<br />
int sum1 = getSum(subgridSums, x1, y1, x1 + size1 - 1, y1 + size1 - 1);</p>
<p> // Mark rows and columns used by the first subgrid<br />
Set<Integer> rowsUsed = new HashSet<>();<br />
Set<Integer> colsUsed = new HashSet<>();<br />
for (int i = x1; i < x1 + size1; i++) rowsUsed.add(i);<br />
for (int j = y1; j < y1 + size1; j++) colsUsed.add(j);</p>
<p> // Iterate over all possible sizes of the second subgrid<br />
for (int size2 = 1; size2 <= N; size2++) {<br />
for (int x2 = 0; x2 <= N - size2; x2++) {<br />
for (int y2 = 0; y2 <= N - size2; y2++) {<br />
// Check if the second subgrid intersects with the first<br />
boolean intersects = false;<br />
for (int i = x2; i < x2 + size2; i++) {<br />
if (rowsUsed.contains(i)) {<br />
intersects = true;<br />
break;<br />
}<br />
}<br />
if (!intersects) {<br />
for (int j = y2; j < y2 + size2; j++) {<br />
if (colsUsed.contains(j)) {<br />
intersects = true;<br />
break;<br />
}<br />
}<br />
}<br />
if (intersects) continue;</p>
<p> int sum2 = getSum(subgridSums, x2, y2, x2 + size2 - 1, y2 + size2 - 1);<br />
maxSum = Math.max(maxSum, sum1 + sum2);<br />
}<br />
}<br />
}<br />
}<br />
}<br />
}</p>
<p> return maxSum;<br />
}</p>
<p> private static int getSum(int[][] subgridSums, int x1, int y1, int x2, int y2) {<br />
return subgridSums[x2 + 1][y2 + 1] - subgridSums[x1][y2 + 1] - subgridSums[x2 + 1][y1] + subgridSums[x1][y1];<br />
}</p>