# Maximum sum of a Matrix where each value is from a unique row and column

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

Given a matrix of size N X N, the task is to find maximum sum of this Matrix where each value picked is from a unique column for every row.
Examples:

```Input: matrix = [[3, 4, 4, 4],
[1, 3, 4, 4],
[3, 2, 3, 4],
[4, 4, 4, 4]]
Output: 16
Explanation:
Selecting (0, 1) from row 1 = 4
Selecting (1, 2) from row 2 = 4
Selecting (2, 3) from row 3 = 4
Selecting (3, 0) from row 4 = 4
Therefore, max sum = 4 + 4 + 4 + 4 = 16

Input: matrix = [[0, 1, 0, 1],
[3, 0, 0, 2],
[1, 0, 2, 0],
[0, 2, 0, 0]]
Output: 8
Explanation:
Selecting (0, 3) from row 1 = 1
Selecting (1, 0) from row 2 = 3
Selecting (2, 2) from row 3 = 2
Selecting (3, 1) from row 4 = 2
Therefore, max sum = 1 + 3 + 2 + 2 = 8```

Approach:

• Generate a numeric string of size N containing numbers from 1 to N
• Find the permutation of this string (N!).
• Now pairing is done between the permutations, such that each N! pairing has a unique column for every row.
• Then calculate the sum of values for all the pairs.

Below is the implementation of the above approach:

## Python3

 `# Python code for maximum sum of``# a Matrix where each value is``# from a unique row and column` `# Permutations using library function``from` `itertools ``import` `permutations` `# Function MaxSum to find``# maximum sum in matrix``def` `MaxSum(side, matrix):``        ` `    ``s ``=` `''``    ``# Generating the string``    ``for` `i ``in` `range``(``0``, side):``        ``s ``=` `s ``+` `str``(i)` `    ``# Permutations of s string``    ``permlist ``=` `permutations(s)``    ` `    ``# List all possible case``    ``cases ``=` `[]``    ` `    ``# Append all possible case in cases list``    ``for` `perm ``in` `list``(permlist):``        ``cases.append(''.join(perm))``    ` `    ``# List to store all Sums``    ``sum` `=` `[]``    ` `    ``# Iterate over all case``    ``for` `c ``in` `cases:``        ``p ``=` `[]``        ``tot ``=` `0``        ``for` `i ``in` `range``(``0``, side):``            ``p.append(matrix[``int``(s[i])][``int``(c[i])])``        ``p.sort()``        ``for` `i ``in` `range``(side``-``1``, ``-``1``, ``-``1``):``            ``tot ``=` `tot ``+` `p[i]``        ``sum``.append(tot)``    `  `    ``# Maximum of sum list is``    ``# the max sum``    ``print``(``max``(``sum``))` `        ` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``side ``=` `4``    ``matrix ``=` `[[``3``, ``4``, ``4``, ``4``], [``1``, ``3``, ``4``, ``4``], [``3``, ``2``, ``3``, ``4``], [``4``, ``4``, ``4``, ``4``]]``    ``MaxSum(side, matrix)``    ``side ``=` `3``    ``matrix ``=` `[[``1``, ``2``, ``3``], [``6``, ``5``, ``4``], [``7``, ``9``, ``8``]]``    ``MaxSum(side, matrix)`

Output:

```16
18```

Time complexity: O(K), where K = N!
Auxiliary Space complexity: O(K), where K = N!

My Personal Notes arrow_drop_up