Print maximum sum square sub-matrix of given size - GeeksforGeeks

02 May, 2022
Given an N x N matrix, find a k x k submatrix where k <= N and k >= 1, such that sum of all the elements in submatrix is maximum. The input matrix can contain zero, positive and negative numbers.For example consider below matrix, if k = 3, then output should print the sub-matrix enclosed in blue.  
We strongly recommend you to minimize your browser and try this yourself first.A Simple Solution is to consider all possible sub-squares of size k x k in our input matrix and find the one which has maximum sum. Time complexity of above solution is O(N2k2).We can solve this problem in O(N2) time. This problem is mainly an extension of this problem of printing all sums. The idea is to preprocess the given square matrix. In the preprocessing step, calculate sum of all vertical strips of size k x 1 in a temporary square matrix stripSum[][]. Once we have sum of all vertical strips, we can calculate sum of first sub-square in a row as sum of first k strips in that row, and for remaining sub-squares, we can calculate sum in O(1) time by removing the leftmost strip of previous subsquare and adding the rightmost strip of new square. Below is the implementation of above idea. 
C++
C
Java
Python3
C#
Javascript
// An efficient C++ program to find maximum sum sub-square// matrix#include <bits/stdc++.h>using namespace std; // Size of given matrix#define N 5 // A O(n^2) function to the maximum sum sub-squares of size// k x k in a given square matrix of size n x nvoid printMaxSumSub(int mat[][N], int k){    // k must be smaller than or equal to n    if (k > N)        return;     // 1: PREPROCESSING    // To store sums of all strips of size k x 1    int stripSum[N][N];     // Go column by column    for (int j = 0; j < N; j++) {        // Calculate sum of first k x 1 rectangle in this        // column        int sum = 0;        for (int i = 0; i < k; i++)            sum += mat[i][j];        stripSum[0][j] = sum;         // Calculate sum of remaining rectangles        for (int i = 1; i < N - k + 1; i++) {            sum += (mat[i + k - 1][j] - mat[i - 1][j]);            stripSum[i][j] = sum;        }    }     // max_sum stores maximum sum and its position in matrix    int max_sum = INT_MIN, *pos = NULL;     // 2: CALCULATE SUM of Sub-Squares using stripSum[][]    for (int i = 0; i < N - k + 1; i++) {        // Calculate and print sum of first subsquare in        // this row        int sum = 0;        for (int j = 0; j < k; j++)            sum += stripSum[i][j];         // Update max_sum and position of result        if (sum > max_sum) {            max_sum = sum;            pos = &(mat[i][0]);        }         // Calculate sum of remaining squares in current row        // by removing the leftmost strip of previous        // sub-square and adding a new strip        for (int j = 1; j < N - k + 1; j++) {            sum += (stripSum[i][j + k - 1]                    - stripSum[i][j - 1]);             // Update max_sum and position of result            if (sum > max_sum) {                max_sum = sum;                pos = &(mat[i][j]);            }        }    }     // Print the result matrix    for (int i = 0; i < k; i++) {        for (int j = 0; j < k; j++)            cout << *(pos + i * N + j) << " ";        cout << endl;    }} // Driver program to test above functionint main(){    int mat[N][N] = {        { 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },        { 3, 8, 6, 7, 3 }, { 4, 4, 4, 4, 4 },        { 5, 5, 5, 5, 5 },    };    int k = 3;     cout << "Maximum sum 3 x 3 matrix is\n";    printMaxSumSub(mat, k);     return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// An efficient C program to find maximum sum sub-square// matrix#include <limits.h>#include <stdio.h> // Size of given matrix#define N 5 // A O(n^2) function to the maximum sum sub-squares of size// k x k in a given square matrix of size n x nvoid printMaxSumSub(int mat[][N], int k){    // k must be smaller than or equal to n    if (k > N)        return;     // 1: PREPROCESSING    // To store sums of all strips of size k x 1    int stripSum[N][N];     // Go column by column    for (int j = 0; j < N; j++) {        // Calculate sum of first k x 1 rectangle in this        // column        int sum = 0;        for (int i = 0; i < k; i++)            sum += mat[i][j];        stripSum[0][j] = sum;         // Calculate sum of remaining rectangles        for (int i = 1; i < N - k + 1; i++) {            sum += (mat[i + k - 1][j] - mat[i - 1][j]);            stripSum[i][j] = sum;        }    }     // max_sum stores maximum sum and its position in matrix    int max_sum = INT_MIN, *pos = NULL;     // 2: CALCULATE SUM of Sub-Squares using stripSum[][]    for (int i = 0; i < N - k + 1; i++) {        // Calculate and print sum of first subsquare in        // this row        int sum = 0;        for (int j = 0; j < k; j++)            sum += stripSum[i][j];         // Update max_sum and position of result        if (sum > max_sum) {            max_sum = sum;            pos = &(mat[i][0]);        }         // Calculate sum of remaining squares in current row        // by removing the leftmost strip of previous        // sub-square and adding a new strip        for (int j = 1; j < N - k + 1; j++) {            sum += (stripSum[i][j + k - 1]                    - stripSum[i][j - 1]);             // Update max_sum and position of result            if (sum > max_sum) {                max_sum = sum;                pos = &(mat[i][j]);            }        }    }     // Print the result matrix    for (int i = 0; i < k; i++) {        for (int j = 0; j < k; j++)            printf("%d ", *(pos + i * N + j));        printf("\n");    }} // Driver program to test above functionint main(){    int mat[N][N] = {        { 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2 },        { 3, 8, 6, 7, 3 }, { 4, 4, 4, 4, 4 },        { 5, 5, 5, 5, 5 },    };    int k = 3;     printf("Maximum sum 3 x 3 matrix is\n");    printMaxSumSub(mat, k);     return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// An efficient Java program to find maximum sum// sub-square matrix // Class to store the position of start of// maximum sum in matrixclass Position {    int x;    int y;     // Constructor    Position(int x, int y)    {        this.x = x;        this.y = y;    }     // Updates the position if new maximum sum    // is found    void updatePosition(int x, int y)    {        this.x = x;        this.y = y;    }     // returns the current value of X    int getXPosition() { return this.x; }     // returns the current value of y    int getYPosition() { return this.y; }} class Gfg {    // Size of given matrix    static int N;     // A O(n^2) function to the maximum sum sub-    // squares of size k x k in a given square    // matrix of size n x n    static void printMaxSumSub(int[][] mat, int k)    {         // k must be smaller than or equal to n        if (k > N)            return;         // 1: PREPROCESSING        // To store sums of all strips of size k x 1        int[][] stripSum = new int[N][N];         // Go column by column        for (int j = 0; j < N; j++) {             // Calculate sum of first k x 1 rectangle            // in this column            int sum = 0;            for (int i = 0; i < k; i++)                sum += mat[i][j];            stripSum[0][j] = sum;             // Calculate sum of remaining rectangles            for (int i = 1; i < N - k + 1; i++) {                sum += (mat[i + k - 1][j] - mat[i - 1][j]);                stripSum[i][j] = sum;            }        }         // max_sum stores maximum sum and its        // position in matrix        int max_sum = Integer.MIN_VALUE;        Position pos = new Position(-1, -1);         // 2: CALCULATE SUM of Sub-Squares using        // stripSum[][]        for (int i = 0; i < N - k + 1; i++) {             // Calculate and print sum of first subsquare            // in this row            int sum = 0;            for (int j = 0; j < k; j++)                sum += stripSum[i][j];             // Update max_sum and position of result            if (sum > max_sum) {                max_sum = sum;                pos.updatePosition(i, 0);            }             // Calculate sum of remaining squares in            // current row by removing the leftmost            // strip of previous sub-square and adding            // a new strip            for (int j = 1; j < N - k + 1; j++) {                sum += (stripSum[i][j + k - 1] - stripSum[i][j - 1]);                 // Update max_sum and position of result                if (sum > max_sum) {                    max_sum = sum;                    pos.updatePosition(i, j);                }            }        }         // Print the result matrix        for (int i = 0; i < k; i++) {            for (int j = 0; j < k; j++)                System.out.print(mat[i + pos.getXPosition()][j + pos.getYPosition()]                                 + " ");            System.out.println();        }    }     // Driver program to test above function    public static void main(String[] args)    {        N = 5;        int[][] mat = { { 1, 1, 1, 1, 1 },                        { 2, 2, 2, 2, 2 },                        { 3, 8, 6, 7, 3 },                        { 4, 4, 4, 4, 4 },                        { 5, 5, 5, 5, 5 } };        int k = 3;         System.out.println("Maximum sum 3 x 3 matrix is");        printMaxSumSub(mat, k);    }} // This code is contributed by Aditya Kumar (adityakumar129)
# An efficient Python3 program to find maximum sum# sub-square matrix # Size of given matrixN = 5 # A O(n^2) function to the maximum sum sub-# squares of size k x k in a given square# matrix of size n x ndef printMaxSumSub(mat, k):     # k must be smaller than or equal to n    if (k > N):        return;     # 1: PREPROCESSING    # To store sums of all strips of size k x 1    stripSum = [[0 for j in range(N)] for i in range(N)];     # Go column by column    for j in range(N):                 # Calculate sum of first k x 1 rectangle        # in this column        sum = 0;        for i in range(k):            sum += mat[i][j];        stripSum[0][j] = sum;         # Calculate sum of remaining rectangles        for i in range(1,N-k+1):            sum += (mat[i+k-1][j] - mat[i-1][j]);            stripSum[i][j] = sum;     # max_sum stores maximum sum and its    # position in matrix    max_sum = -1000000000    i_ind = 0    j_ind = 0     # 2: CALCULATE SUM of Sub-Squares using stripSum[][]    for i in range(N-k+1):                 # Calculate and print sum of first subsquare        # in this row        sum = 0;        for j in range(k):            sum += stripSum[i][j];         # Update max_sum and position of result        if (sum > max_sum):            max_sum = sum;            i_ind = i            j_ind = 0          # Calculate sum of remaining squares in        # current row by removing the leftmost        # strip of previous sub-square and adding        # a new strip        for j in range(1,N-k+1):            sum += (stripSum[i][j+k-1] - stripSum[i][j-1]);             # Update max_sum and position of result            if (sum > max_sum):                max_sum = sum;                i_ind = i                j_ind = j     # Print the result matrix    for i in range(k):        for j in range(k):            print(mat[i+i_ind][j+j_ind], end = ' ')        print() # Driver program to test above functionmat = [[1, 1, 1, 1, 1],        [2, 2, 2, 2, 2],        [3, 8, 6, 7, 3],        [4, 4, 4, 4, 4],        [5, 5, 5, 5, 5],    ];k = 3;print("Maximum sum 3 x 3 matrix is");printMaxSumSub(mat, k); # This code is contributed by rutvik_56.
// An efficient C# program to find maximum sum// sub-square matrixusing System; // Class to store the position of start of// maximum sum in matrixclass Position{    int x;    int y;     // Constructor    public Position(int x, int y)    {        this.x = x;        this.y = y;    }     // Updates the position if new maximum sum    // is found    public void updatePosition(int x, int y)    {        this.x = x;        this.y = y;    }     // returns the current value of X    public int getXPosition()    {        return this.x;    }     // returns the current value of y    public int getYPosition()    {        return this.y;    }} class GFG{         // Size of given matrix    static int N;     // A O(n^2) function to the maximum sum sub-    // squares of size k x k in a given square    // matrix of size n x n    static void printMaxSumSub(int[,] mat, int k)    {         // k must be smaller than or equal to n        if (k > N)            return;         // 1: PREPROCESSING        // To store sums of all strips of size k x 1        int[,] stripSum = new int[N, N];         // Go column by column        for (int j = 0; j < N; j++)        {             // Calculate sum of first k x 1 rectangle            // in this column            int sum = 0;            for (int i = 0; i < k; i++)                sum += mat[i, j];            stripSum[0, j] = sum;             // Calculate sum of remaining rectangles            for (int i = 1; i < N - k + 1; i++)            {                sum += (mat[i + k - 1, j] -                        mat[i - 1, j]);                stripSum[i, j] = sum;            }        }         // max_sum stores maximum sum and its        // position in matrix        int max_sum = int.MinValue;        Position pos = new Position(-1, -1);         // 2: CALCULATE SUM of Sub-Squares using stripSum[,]        for (int i = 0; i < N - k + 1; i++)        {             // Calculate and print sum of first subsquare            // in this row            int sum = 0;            for (int j = 0; j < k; j++)                sum += stripSum[i, j];             // Update max_sum and position of result            if (sum > max_sum)            {                max_sum = sum;                pos.updatePosition(i, 0);            }             // Calculate sum of remaining squares in            // current row by removing the leftmost            // strip of previous sub-square and adding            // a new strip            for (int j = 1; j < N - k + 1; j++)            {                sum += (stripSum[i, j + k - 1] -                        stripSum[i, j - 1]);                 // Update max_sum and position of result                if (sum > max_sum)                {                    max_sum = sum;                    pos.updatePosition(i, j);                }            }        }         // Print the result matrix        for (int i = 0; i < k; i++)        {            for (int j = 0; j < k; j++)            {                Console.Write(mat[i + pos.getXPosition(),                                  j + pos.getYPosition()] + " ");            }            Console.WriteLine();        }    }     // Driver Code    public static void Main(String[] args)    {        N = 5;        int[,] mat = {{ 1, 1, 1, 1, 1 },                      { 2, 2, 2, 2, 2 },                        { 3, 8, 6, 7, 3 },                      { 4, 4, 4, 4, 4 },                      { 5, 5, 5, 5, 5 }};        int k = 3;         Console.WriteLine("Maximum sum 3 x 3 matrix is");        printMaxSumSub(mat, k);    }} // This code is contributed by Princi Singh
<script> // An efficient Javascript program to find maximum sum// sub-square matrix // Class to store the position of start of// maximum sum in matrixclass Position{    constructor()    {        this.x = 0;        this.y = 0;    }     // Constructor    Position(x, y)    {        this.x = x;        this.y = y;    }     // Updates the position if new maximum sum    // is found    updatePosition(x, y)    {        this.x = x;        this.y = y;    }     // returns the current value of X    getXPosition()    {        return this.x;    }     // returns the current value of y    getYPosition()    {        return this.y;    }} // Size of given matrixvar N = 0;// A O(n^2) function to the maximum sum sub-// squares of size k x k in a given square// matrix of size n x nfunction printMaxSumSub(mat, k){    // k must be smaller than or equal to n    if (k > N)        return;    // 1: PREPROCESSING    // To store sums of all strips of size k x 1    var stripSum = Array.from(Array(N), ()=>Array(N));    // Go column by column    for (var j = 0; j < N; j++)    {        // Calculate sum of first k x 1 rectangle        // in this column        var sum = 0;        for (var i = 0; i < k; i++)            sum += mat[i][j];        stripSum[0][j] = sum;        // Calculate sum of remaining rectangles        for (var i = 1; i < N - k + 1; i++)        {            sum += (mat[i + k - 1][j] -                    mat[i - 1][j]);            stripSum[i][j] = sum;        }    }    // max_sum stores maximum sum and its    // position in matrix    var max_sum = -1000000000;    var pos = new Position(-1, -1);    // 2: CALCULATE SUM of Sub-Squares using stripSum[,]    for (var i = 0; i < N - k + 1; i++)    {        // Calculate and print sum of first subsquare        // in this row        var sum = 0;        for (var j = 0; j < k; j++)            sum += stripSum[i][j];        // Update max_sum and position of result        if (sum > max_sum)        {            max_sum = sum;            pos.updatePosition(i, 0);        }        // Calculate sum of remaining squares in        // current row by removing the leftmost        // strip of previous sub-square and adding        // a new strip        for (var j = 1; j < N - k + 1; j++)        {            sum += (stripSum[i][j + k - 1] -                    stripSum[i][j - 1]);            // Update max_sum and position of result            if (sum > max_sum)            {                max_sum = sum;                pos.updatePosition(i, j);            }        }    }    // Print the result matrix    for (var i = 0; i < k; i++)    {        for (var j = 0; j < k; j++)        {            document.write(mat[i + pos.getXPosition()][                              j + pos.getYPosition()] + " ");        }        document.write("<br>");    }}// Driver CodeN = 5;var mat = [[ 1, 1, 1, 1, 1 ],              [ 2, 2, 2, 2, 2 ],                [ 3, 8, 6, 7, 3 ],              [ 4, 4, 4, 4, 4 ],              [ 5, 5, 5, 5, 5 ]];var k = 3;document.write("Maximum sum 3 x 3 matrix is<br>");printMaxSumSub(mat, k);   </script>
Output: 
Maximum sum 3 x 3 matrix is
8 6 7
4 4 4
5 5 5
Related Articles: Given an n x n square matrix, find sum of all sub-squares of size k x k Maximum sum rectangle in a 2D matrixThis article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Vivekkumar Singh
princi singh
rrrtnx
rutvik_56
simmytarika5
adityakumar129
Matrix
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum size square sub-matrix with all 1s
Sudoku | Backtracking-7
Divide and Conquer | Set 5 (Strassen's Matrix Multiplication)
Count all possible paths from top left to bottom right of a mXn matrix
Maximum size rectangle binary sub-matrix with all 1s
Program to multiply two matrices
Inplace rotate square matrix by 90 degrees | Set 1
Min Cost Path | DP-6
Printing all solutions in N-Queen Problem
Rotate a matrix by 90 degree in clockwise direction without using any extra space