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

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:16Explanation: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 = 16Input:matrix = [[0, 1, 0, 1], [3, 0, 0, 2], [1, 0, 2, 0], [0, 2, 0, 0]]Output:8Explanation: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!

*, where K = N!*

**Auxiliary Space complexity:**O(K)