## Problem: Suppose you are given an m by n bitmap as an array M[0:m][0:n] of 0s and 1s. A solid block in M is a subarray of the form M[i:i'][j:j'] in which all bits are equal. A solid block is square if it has the same number of rows and columns. Describe an algorithm to find the maximum area of a solid square block in M in O(n^2) time using dynamic programming. ## Algorithm Description The algorithm maxSolidSquare correctly finds the maximum area of a solid square block in M. It starts off by initializing two arrays, dp0 and dp1, then for each cell, if it is in the first row or column then dp0[i][j] or dp1[i][j] = 1. Else, use the recurrence. Finally, it tracks the maximum value of dp0[i][j] and dp1[i][j] while iterating then returning the square of the maximum value. ``` fun maxSolidSquare(M[0:m-1][0:n-1]) { dp0 = [m][n]; dp1 = [m][n]; max = 0; for (int i=0; i < m-1; i++) { for (int j=0; j<n-1; j++) { if (M[i][j] == 0) { if (i == 0 or j == 0) { dp0[i][j] = 1; } else { dp0[i][j] = 1 + min(dp0[i-1][j], dp0[i][j-1], dp0[i-1][j-1]); } dp1[i][j] = 0; } else { if (i==0 or j==0) { dp1[i][j] = 1; } else { dp1[i][j] = 1 + min(dp1[i-1][j], dp1[i][j-1], dp1[i-1][j-1]); } dp0[i][j] = 0; } max = max(max, dp0[i][j], dp1[i][j]); } } return max * max; } ``` ## Correctness Proof Goal: maxSolidSquare(M) will return the area of the largest square subarray in which all bits are equal (all 0s or all 1s). We will prove by induction hypothesis ## Induction Hypothesis Assume that for all cells up to (i-1,j), (i,j-1), and (i-1,j-1), we have correctly computed the largest solid square side lengths ending there. ## Base Cases - Both i=0 and j=0 (Empty Array): This will output 0 as there will be no iteration. - i=0 or j=0: This will output a length of 1 as long as it has a valid 0 or 1. ## Induction Step: For cell (i,j): - If M[i][j] == 0: The largest square ending here can only extend a square of 0s if the top, left, and top-left cells also end solid 0. Thus, ```dp0[i][j] = 1 + min(dp0[i-1][j], dp0[i][j-1], dp0[i-1][j-1])``` - This is the exact same method if it were 1s instead Thus, the recurrence maintains correctness for all (i,j). ## Time Complexity For each cell (i,j) is processed once, and each step does O(1) work ### Recurrence: ```T(i,j) = T(i,j - 1) + O(1)``` ### Time Complexity: ``` T(m,n) = O(mn)``` Given a square matrix m=n: ```T(n) = O(n^2)```