class Solution { public int countSquares(int[][] matrix) { int m = matrix.length , n = matrix[0].length; int dp[][]= new int[m][n]; int count = 0; //meaning of an element in dp -> count of submatrices in for that element //traverse reversely for(int i = m-1 ; i>=0 ; i--){ for(int j = n-1; j>=0 ; j--){ //if last row or coloumn , there can be 1 square or none at all if(i == m-1 || j == n-1) dp[i][j] = matrix[i][j]; else{ if(matrix[i][j] == 0) dp[i][j] = 0; //no. of submatrice = minof(right ,bottom , diagnol) +1; else dp[i][j] = 1+Math.min(dp[i+1][j+1] , Math.min(dp[i+1][j] , dp[i][j+1])); } count+= dp[i][j]; } } return count; } }