Related Articles

# Given an n x n square matrix, find sum of all sub-squares of size k x k

• Difficulty Level : Hard
• Last Updated : 01 Apr, 2021

Given an n x n square matrix, find sum of all sub-squares of size k x k where k is smaller than or equal to n.

Examples :

```Input:
n = 5, k = 3
arr[][] = { {1, 1, 1, 1, 1},
{2, 2, 2, 2, 2},
{3, 3, 3, 3, 3},
{4, 4, 4, 4, 4},
{5, 5, 5, 5, 5},
};
Output:
18  18  18
27  27  27
36  36  36

Input:
n = 3, k = 2
arr[][] = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
Output:
12  16
24  28```

A Simple Solution is to one by one pick starting point (leftmost-topmost corner) of all possible sub-squares. Once the starting point is picked, calculate sum of sub-square starting with the picked starting point.

Following is the implementation of this idea.

## C++

 `// A simple C++ program to find sum of all subsquares of size k x k``#include ``using` `namespace` `std;` `// Size of given matrix``#define n 5` `// A simple function to find sum of all sub-squares of size k x k``// in a given square matrix of size n x n``void` `printSumSimple(``int` `mat[][n], ``int` `k)``{``   ``// k must be smaller than or equal to n``   ``if` `(k > n) ``return``;` `   ``// row number of first cell in current sub-square of size k x k``   ``for` `(``int` `i=0; i

## Java

 `// A simple Java program to find sum of all``// subsquares of size k x k``class` `GFG``{``    ` `    ``// Size of given matrix``    ``static` `final` `int` `n = ``5``;``    ` `    ``// A simple function to find sum of all``    ``//sub-squares of size k x k in a given``    ``// square matrix of size n x n``    ``static` `void` `printSumSimple(``int` `mat[][], ``int` `k)``    ``{` `        ``// k must be smaller than or``        ``// equal to n``        ``if` `(k > n) ``return``;``        ` `        ``// row number of first cell in``        ``// current sub-square of size k x k``        ``for` `(``int` `i = ``0``; i < n-k+``1``; i++)``        ``{``            ` `            ``// column of first cell in current``            ``// sub-square of size k x k``            ``for` `(``int` `j = ``0``; j < n-k+``1``; j++)``            ``{``                ` `                ``// Calculate and print sum of``                ``// current sub-square``                ``int` `sum = ``0``;``                ``for` `(``int` `p = i; p < k+i; p++)``                    ``for` `(``int` `q = j; q < k+j; q++)``                        ``sum += mat[p][q];` `                ``System.out.print(sum+ ``" "``);``            ``}``        ` `            ``// Line separator for sub-squares``            ``// starting with next row``            ``System.out.println();``        ``}``    ``}``    ` `    ``// Driver Program to test above function``    ``public` `static` `void` `main(String arg[])``    ``{``        ``int` `mat[][] = {{``1``, ``1``, ``1``, ``1``, ``1``},``                       ``{``2``, ``2``, ``2``, ``2``, ``2``},``                       ``{``3``, ``3``, ``3``, ``3``, ``3``},``                       ``{``4``, ``4``, ``4``, ``4``, ``4``},``                       ``{``5``, ``5``, ``5``, ``5``, ``5``}};``        ``int` `k = ``3``;``        ``printSumSimple(mat, k);``    ``}``}` `// This code is contributed by Anant Agarwal.`

## Python3

 `# A simple Python 3 program to find sum``# of all subsquares of size k x k` `# Size of given matrix``n ``=` `5` `# A simple function to find sum of all``# sub-squares of size k x k in a given``# square matrix of size n x n``def` `printSumSimple(mat, k):` `    ``# k must be smaller than or equal to n``    ``if` `(k > n):``        ``return` `    ``# row number of first cell in current``    ``# sub-square of size k x k``    ``for` `i ``in` `range``(n ``-` `k ``+` `1``):``    ` `        ``# column of first cell in current``        ``# sub-square of size k x k``        ``for` `j ``in` `range``(n ``-` `k ``+` `1``):``            ` `            ``# Calculate and print sum of``            ``# current sub-square``            ``sum` `=` `0``            ``for` `p ``in` `range``(i, k ``+` `i):``                ``for` `q ``in` `range``(j, k ``+` `j):``                    ``sum` `+``=` `mat[p][q]``            ``print``(``sum``, end ``=` `" "``)``    ` `        ``# Line separator for sub-squares``        ``# starting with next row``        ``print``()` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:` `    ``mat ``=` `[[``1``, ``1``, ``1``, ``1``, ``1``],``           ``[``2``, ``2``, ``2``, ``2``, ``2``],``           ``[``3``, ``3``, ``3``, ``3``, ``3``],``           ``[``4``, ``4``, ``4``, ``4``, ``4``],``           ``[``5``, ``5``, ``5``, ``5``, ``5``]]``    ``k ``=` `3``    ``printSumSimple(mat, k)` `# This code is contributed by ita_c`

## C#

 `// A simple C# program to find sum of all``// subsquares of size k x k``using` `System;` `class` `GFG``{``    ``// Size of given matrix``    ``static` `int` `n = 5;``    ` `    ``// A simple function to find sum of all``    ``//sub-squares of size k x k in a given``    ``// square matrix of size n x n``    ``static` `void` `printSumSimple(``int` `[,]mat, ``int` `k)``    ``{``        ``// k must be smaller than or``        ``// equal to n``        ``if` `(k > n) ``return``;``        ` `        ``// row number of first cell in``        ``// current sub-square of size k x k``        ``for` `(``int` `i = 0; i < n-k+1; i++)``        ``{``            ``// column of first cell in current``            ``// sub-square of size k x k``            ``for` `(``int` `j = 0; j < n-k+1; j++)``            ``{``                ``// Calculate and print sum of``                ``// current sub-square``                ``int` `sum = 0;``                ``for` `(``int` `p = i; p < k+i; p++)``                    ``for` `(``int` `q = j; q < k+j; q++)``                        ``sum += mat[p,q];` `                ``Console.Write(sum+ ``" "``);``            ``}``        ` `            ``// Line separator for sub-squares``            ``// starting with next row``            ``Console.WriteLine();``        ``}``    ``}``    ` `    ``// Driver Program to test above function``    ``public` `static` `void` `Main()``    ``{``        ``int` `[,]mat = {{1, 1, 1, 1, 1},``                      ``{2, 2, 2, 2, 2},``                      ``{3, 3, 3, 3, 3},``                      ``{4, 4, 4, 4, 4},``                      ``{5, 5, 5, 5, 5}};``        ``int` `k = 3;``        ``printSumSimple(mat, k);``    ``}``}` `// This code is contributed by Sam007`

## PHP

 ` ``\$n``) ``return``;``    ` `    ``// row number of first cell in``    ``// current sub-square of size``    ``// k x k``    ``for``(``\$i` `= 0; ``\$i` `< ``\$n` `- ``\$k` `+ 1; ``\$i``++)``    ``{``        ` `        ``// column of first cell in``        ``// current sub-square of size``        ``// k x k``        ``for``(``\$j` `= 0; ``\$j` `< ``\$n` `- ``\$k` `+ 1; ``\$j``++)``        ``{``            ` `            ``// Calculate and print sum of``            ``// current sub-square``            ``\$sum` `= 0;``            ``for` `(``\$p` `= ``\$i``; ``\$p` `< ``\$k` `+ ``\$i``; ``\$p``++)``                ``for` `(``\$q` `= ``\$j``; ``\$q` `< ``\$k` `+ ``\$j``; ``\$q``++)``                    ``\$sum` `+= ``\$mat``[``\$p``][``\$q``];``            ``echo` `\$sum` `, ``" "``;``        ``}``    ` `        ``// Line separator for sub-squares``        ``// starting with next row``        ``echo` `"\n"``;``    ``}``}` `    ``// Driver Code``    ``\$mat` `= ``array``(``array``(1, 1, 1, 1, 1),``                 ``array``(2, 2, 2, 2, 2,),``                  ``array``(3, 3, 3, 3, 3,),``                 ``array``(4, 4, 4, 4, 4,),``                 ``array``(5, 5, 5, 5, 5));``                    ` `    ``\$k` `= 3;``    ``printSumSimple(``\$mat``, ``\$k``);` `// This code is contributed by anuj_67.``?>`

## Javascript

 ``

Output:

```  18  18  18
27  27  27
36  36  36```

Time complexity of above solution is O(k2n2). We can solve this problem in O(n2) time using a Tricky Solution. 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.

Following is the implementation of this idea.

## C++

 `// An efficient C++ program to find sum of all subsquares of size k x k``#include ``using` `namespace` `std;` `// Size of given matrix``#define n 5` `// A O(n^2) function to find sum of all sub-squares of size k x k``// in a given square matrix of size n x n``void` `printSumTricky(``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

## Java

 `// An efficient Java program to find``// sum of all subsquares of size k x k``import` `java.io.*;` `class` `GFG {``    ` `// Size of given matrix``static` `int` `n = ``5``;` `// A O(n^2) function to find sum of all``// sub-squares of size k x k in a given``// square matrix of size n x n``static` `void` `printSumTricky(``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;``    ``}``    ``}` `    ``// 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];``    ``System.out.print(sum + ``" "``);` `    ``// 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``]);``        ``System.out.print(sum + ``" "``);``    ``}``    ``System.out.println();``    ``}``}` `// Driver program to test above function``public` `static` `void` `main(String[] args)``{``    ``int` `mat[][] = {{``1``, ``1``, ``1``, ``1``, ``1``},``                   ``{``2``, ``2``, ``2``, ``2``, ``2``},``                   ``{``3``, ``3``, ``3``, ``3``, ``3``},``                   ``{``4``, ``4``, ``4``, ``4``, ``4``},``                   ``{``5``, ``5``, ``5``, ``5``, ``5``},``                  ``};``    ``int` `k = ``3``;``    ``printSumTricky(mat, k);``}``}` `// This code is contributed by vt_m.`

## Python3

 `# An efficient Python3 program to find sum``# of all subsquares of size k x k` `# A O(n^2) function to find sum of all ``# sub-squares of size k x k in a given``# square matrix of size n x n``def` `printSumTricky(mat, k):``    ``global` `n``    ` `    ``# 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 ``=` `[[``None``] ``*` `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` `    ``# 2: CALCULATE SUM of Sub-Squares``    ``# using stripSum[][]``    ``for` `i ``in` `range``(n ``-` `k ``+` `1``):``        ` `        ``# Calculate and prsum of first``        ``# subsquare in this row``        ``Sum` `=` `0``        ``for` `j ``in` `range``(k):``            ``Sum` `+``=` `stripSum[i][j]``        ``print``(``Sum``, end ``=` `" "``)` `        ``# 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``])``            ``print``(``Sum``, end ``=` `" "``)` `        ``print``()` `# Driver Code``n ``=` `5``mat ``=` `[[``1``, ``1``, ``1``, ``1``, ``1``],``       ``[``2``, ``2``, ``2``, ``2``, ``2``],``       ``[``3``, ``3``, ``3``, ``3``, ``3``],``       ``[``4``, ``4``, ``4``, ``4``, ``4``],``       ``[``5``, ``5``, ``5``, ``5``, ``5``]]``k ``=` `3``printSumTricky(mat, k)` `# This code is contributed by PranchalK`

## C#

 `// An efficient C# program to find``// sum of all subsquares of size k x k``using` `System;``class` `GFG {``    ` `    ``// Size of given matrix``    ``static` `int` `n = 5;``    ` `    ``// A O(n^2) function to find sum of all``    ``// sub-squares of size k x k in a given``    ``// square matrix of size n x n``    ``static` `void` `printSumTricky(``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;``            ``}``        ``}``    ` `        ``// 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];``                ` `            ``Console.Write(sum + ``" "``);``        ` `            ``// 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]);``                ``Console.Write(sum + ``" "``);``            ``}``            ``Console.WriteLine();``        ``}``    ``}``    ` `    ``// Driver program to test above function``    ``public` `static` `void` `Main()``    ``{``        ``int` `[,]mat = {{1, 1, 1, 1, 1},``                    ``{2, 2, 2, 2, 2},``                    ``{3, 3, 3, 3, 3},``                    ``{4, 4, 4, 4, 4},``                    ``{5, 5, 5, 5, 5},``                    ``};``        ``int` `k = 3;``        ``printSumTricky(mat, k);``    ``}``}` `// This code is contributed by nitin mittal.`

## PHP

 ` ``\$n``) ``return``;` `// 1: PREPROCESSING``// To store sums of all``// strips of size k x 1``\$stripSum` `= ``array``(``array``());` `// Go column by column``for` `(``\$j` `= 0; ``\$j` `< ``\$n``; ``\$j``++)``{``    ``// Calculate sum of first``    ``// k x 1 rectangle in this column``    ``\$sum` `= 0;``    ``for` `(``\$i` `= 0; ``\$i` `< ``\$k``; ``\$i``++)``        ``\$sum` `+= ``\$mat``[``\$i``][``\$j``];``    ``\$stripSum``[``\$j``] = ``\$sum``;` `    ``// Calculate sum of``    ``// remaining rectangles``    ``for` `(``\$i` `= 1; ``\$i` `< ``\$n` `- ``\$k` `+ 1; ``\$i``++)``    ``{``            ``\$sum` `+= (``\$mat``[``\$i` `+ ``\$k` `- 1][``\$j``] -``                          ``\$mat``[``\$i` `- 1][``\$j``]);``            ``\$stripSum``[``\$i``][``\$j``] = ``\$sum``;``    ``}``}` `// 2: CALCULATE SUM of``// Sub-Squares using stripSum[][]``for` `(``\$i` `= 0; ``\$i` `< ``\$n` `- ``\$k` `+ 1; ``\$i``++)``{``    ``// Calculate and print sum of``    ``// first subsquare in this row``    ``\$sum` `= 0;``    ``for` `(``\$j` `= 0; ``\$j` `< ``\$k``; ``\$j``++)``        ``\$sum` `+= ``\$stripSum``[``\$i``][``\$j``];``    ``echo` `\$sum` `, ``" "``;` `    ``// Calculate sum of remaining``    ``// squares in current row by``    ``// removing the leftmost strip``    ``// of previous sub-square and``    ``// adding a new strip``    ``for` `(``\$j` `= 1; ``\$j` `< ``\$n` `- ``\$k` `+ 1; ``\$j``++)``    ``{``        ``\$sum` `+= (``\$stripSum``[``\$i``][``\$j` `+ ``\$k` `- 1] -``                 ``\$stripSum``[``\$i``][``\$j` `- 1]);``        ``echo` `\$sum` `, ``" "``;``    ``}` `    ``echo` `"\n"``;``}``}` `// Driver Code``\$mat` `= ``array``(``array``(1, 1, 1, 1, 1),``             ``array``(2, 2, 2, 2, 2),``             ``array``(3, 3, 3, 3, 3),``             ``array``(4, 4, 4, 4, 4),``             ``array``(5, 5, 5, 5, 5));``\$k` `= 3;``printSumTricky(``\$mat``, ``\$k``);` `// This code is contributed by anuj_67.``?>`

## Javascript

 ``

Output :

```  18  18  18
27  27  27
36  36  36```