diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/README.md b/solution/1900-1999/1947.Maximum Compatibility Score Sum/README.md index 9213b7ce2c14d..6ee0135a5b133 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/README.md +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/README.md @@ -75,9 +75,15 @@ tags: ### 方法一:预处理 + 回溯 -预处理出每个学生与每个导师的兼容性评分,然后使用回溯的方法枚举所有的配对方案,求出最大的兼容性评分和。 +我们可以先预处理出每个学生 $i$ 和导师 $j$ 之间的兼容性评分 $g[i][j]$,然后使用回溯算法求解。 -时间复杂度 $O(m!)$,其中 $m$ 为学生或导师的数量。 +定义一个函数 $\textit{dfs}(i, s)$,其中 $i$ 表示当前处理到第 $i$ 个学生,$s$ 表示当前的兼容性评分和。 + +在 $\textit{dfs}(i, s)$ 中,如果 $i \geq m$,表示所有学生都已经分配完毕,此时更新答案为 $\max(\textit{ans}, s)$。否则,我们枚举第 $i$ 个学生可以分配给哪个导师,然后递归处理下一个学生。过程中,我们用一个数组 $\textit{vis}$ 记录哪些导师已经被分配过,以避免重复分配。 + +我们调用 $\textit{dfs}(0, 0)$ 即可得到最大的兼容性评分和。 + +时间复杂度 $O(m!)$,空间复杂度 $O(m^2)$。其中 $m$ 为学生和导师的数量。 @@ -88,24 +94,24 @@ class Solution: def maxCompatibilitySum( self, students: List[List[int]], mentors: List[List[int]] ) -> int: - def dfs(i, t): - if i == m: + def dfs(i: int, s: int): + if i >= m: nonlocal ans - ans = max(ans, t) + ans = max(ans, s) return for j in range(m): if not vis[j]: vis[j] = True - dfs(i + 1, t + g[i][j]) + dfs(i + 1, s + g[i][j]) vis[j] = False + ans = 0 m = len(students) - g = [[0] * m for _ in range(m)] - for i in range(m): - for j in range(m): - g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j])) vis = [False] * m - ans = 0 + g = [[0] * m for _ in range(m)] + for i, x in enumerate(students): + for j, y in enumerate(mentors): + g[i][j] = sum(a == b for a, b in zip(x, y)) dfs(0, 0) return ans ``` @@ -114,10 +120,10 @@ class Solution: ```java class Solution { - private int[][] g; - private boolean[] vis; private int m; private int ans; + private int[][] g; + private boolean[] vis; public int maxCompatibilitySum(int[][] students, int[][] mentors) { m = students.length; @@ -126,7 +132,9 @@ class Solution { for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < students[i].length; ++k) { - g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0; + if (students[i][k] == mentors[j][k]) { + ++g[i][j]; + } } } } @@ -134,15 +142,15 @@ class Solution { return ans; } - private void dfs(int i, int t) { - if (i == m) { - ans = Math.max(ans, t); + private void dfs(int i, int s) { + if (i >= m) { + ans = Math.max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } @@ -158,10 +166,8 @@ public: int maxCompatibilitySum(vector>& students, vector>& mentors) { int m = students.size(); int n = students[0].size(); - int g[m][m]; - memset(g, 0, sizeof g); - bool vis[m]; - memset(vis, 0, sizeof vis); + vector> g(m, vector(m)); + vector vis(m); for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < n; ++k) { @@ -170,15 +176,15 @@ public: } } int ans = 0; - function dfs = [&](int i, int t) { - if (i == m) { - ans = max(ans, t); + auto dfs = [&](this auto&& dfs, int i, int s) { + if (i >= m) { + ans = max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } @@ -196,26 +202,26 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) { m, n := len(students), len(students[0]) g := make([][]int, m) vis := make([]bool, m) - for i := range g { + for i, x := range students { g[i] = make([]int, m) - for j := range g { + for j, y := range mentors { for k := 0; k < n; k++ { - if students[i][k] == mentors[j][k] { + if x[k] == y[k] { g[i][j]++ } } } } var dfs func(int, int) - dfs = func(i, t int) { + dfs = func(i, s int) { if i == m { - ans = max(ans, t) + ans = max(ans, s) return } for j := 0; j < m; j++ { if !vis[j] { vis[j] = true - dfs(i+1, t+g[i][j]) + dfs(i+1, s+g[i][j]) vis[j] = false } } @@ -225,6 +231,124 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) { } ``` +#### TypeScript + +```ts +function maxCompatibilitySum(students: number[][], mentors: number[][]): number { + let ans = 0; + const m = students.length; + const vis: boolean[] = Array(m).fill(false); + const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + const dfs = (i: number, s: number): void => { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + dfs(0, 0); + return ans; +} +``` + +#### Rust + +```rust +impl Solution { + pub fn max_compatibility_sum(students: Vec>, mentors: Vec>) -> i32 { + let mut ans = 0; + let m = students.len(); + let mut vis = vec![false; m]; + let mut g = vec![vec![0; m]; m]; + + for i in 0..m { + for j in 0..m { + for k in 0..students[i].len() { + if students[i][k] == mentors[j][k] { + g[i][j] += 1; + } + } + } + } + + fn dfs(i: usize, s: i32, m: usize, g: &Vec>, vis: &mut Vec, ans: &mut i32) { + if i >= m { + *ans = (*ans).max(s); + return; + } + for j in 0..m { + if !vis[j] { + vis[j] = true; + dfs(i + 1, s + g[i][j], m, g, vis, ans); + vis[j] = false; + } + } + } + + dfs(0, 0, m, &g, &mut vis, &mut ans); + ans + } +} +``` + +#### JavaScript + +```js +/** + * @param {number[][]} students + * @param {number[][]} mentors + * @return {number} + */ +var maxCompatibilitySum = function (students, mentors) { + let ans = 0; + const m = students.length; + const vis = Array(m).fill(false); + const g = Array.from({ length: m }, () => Array(m).fill(0)); + + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + + const dfs = function (i, s) { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + + dfs(0, 0); + return ans; +}; +``` + diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/README_EN.md b/solution/1900-1999/1947.Maximum Compatibility Score Sum/README_EN.md index 631659279f02d..26f3fbad5e09a 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/README_EN.md +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/README_EN.md @@ -74,7 +74,17 @@ The compatibility score sum is 3 + 2 + 3 = 8. -### Solution 1 +### Solution 1: Preprocessing + Backtracking + +We can first preprocess the compatibility score $g[i][j]$ between each student $i$ and mentor $j$, and then use a backtracking algorithm to solve the problem. + +Define a function $\textit{dfs}(i, s)$, where $i$ represents the current student being processed, and $s$ represents the current sum of compatibility scores. + +In $\textit{dfs}(i, s)$, if $i \geq m$, it means all students have been assigned, and we update the answer to $\max(\textit{ans}, s)$. Otherwise, we enumerate which mentor the $i$-th student can be assigned to, and then recursively process the next student. During the process, we use an array $\textit{vis}$ to record which mentors have already been assigned to avoid duplicate assignments. + +We call $\textit{dfs}(0, 0)$ to get the maximum compatibility score sum. + +The time complexity is $O(m!)$, and the space complexity is $O(m^2)$. Here, $m$ is the number of students and mentors. @@ -85,24 +95,24 @@ class Solution: def maxCompatibilitySum( self, students: List[List[int]], mentors: List[List[int]] ) -> int: - def dfs(i, t): - if i == m: + def dfs(i: int, s: int): + if i >= m: nonlocal ans - ans = max(ans, t) + ans = max(ans, s) return for j in range(m): if not vis[j]: vis[j] = True - dfs(i + 1, t + g[i][j]) + dfs(i + 1, s + g[i][j]) vis[j] = False + ans = 0 m = len(students) - g = [[0] * m for _ in range(m)] - for i in range(m): - for j in range(m): - g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j])) vis = [False] * m - ans = 0 + g = [[0] * m for _ in range(m)] + for i, x in enumerate(students): + for j, y in enumerate(mentors): + g[i][j] = sum(a == b for a, b in zip(x, y)) dfs(0, 0) return ans ``` @@ -111,10 +121,10 @@ class Solution: ```java class Solution { - private int[][] g; - private boolean[] vis; private int m; private int ans; + private int[][] g; + private boolean[] vis; public int maxCompatibilitySum(int[][] students, int[][] mentors) { m = students.length; @@ -123,7 +133,9 @@ class Solution { for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < students[i].length; ++k) { - g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0; + if (students[i][k] == mentors[j][k]) { + ++g[i][j]; + } } } } @@ -131,15 +143,15 @@ class Solution { return ans; } - private void dfs(int i, int t) { - if (i == m) { - ans = Math.max(ans, t); + private void dfs(int i, int s) { + if (i >= m) { + ans = Math.max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } @@ -155,10 +167,8 @@ public: int maxCompatibilitySum(vector>& students, vector>& mentors) { int m = students.size(); int n = students[0].size(); - int g[m][m]; - memset(g, 0, sizeof g); - bool vis[m]; - memset(vis, 0, sizeof vis); + vector> g(m, vector(m)); + vector vis(m); for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < n; ++k) { @@ -167,15 +177,15 @@ public: } } int ans = 0; - function dfs = [&](int i, int t) { - if (i == m) { - ans = max(ans, t); + auto dfs = [&](this auto&& dfs, int i, int s) { + if (i >= m) { + ans = max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } @@ -193,26 +203,26 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) { m, n := len(students), len(students[0]) g := make([][]int, m) vis := make([]bool, m) - for i := range g { + for i, x := range students { g[i] = make([]int, m) - for j := range g { + for j, y := range mentors { for k := 0; k < n; k++ { - if students[i][k] == mentors[j][k] { + if x[k] == y[k] { g[i][j]++ } } } } var dfs func(int, int) - dfs = func(i, t int) { + dfs = func(i, s int) { if i == m { - ans = max(ans, t) + ans = max(ans, s) return } for j := 0; j < m; j++ { if !vis[j] { vis[j] = true - dfs(i+1, t+g[i][j]) + dfs(i+1, s+g[i][j]) vis[j] = false } } @@ -222,6 +232,124 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) { } ``` +#### TypeScript + +```ts +function maxCompatibilitySum(students: number[][], mentors: number[][]): number { + let ans = 0; + const m = students.length; + const vis: boolean[] = Array(m).fill(false); + const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + const dfs = (i: number, s: number): void => { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + dfs(0, 0); + return ans; +} +``` + +#### Rust + +```rust +impl Solution { + pub fn max_compatibility_sum(students: Vec>, mentors: Vec>) -> i32 { + let mut ans = 0; + let m = students.len(); + let mut vis = vec![false; m]; + let mut g = vec![vec![0; m]; m]; + + for i in 0..m { + for j in 0..m { + for k in 0..students[i].len() { + if students[i][k] == mentors[j][k] { + g[i][j] += 1; + } + } + } + } + + fn dfs(i: usize, s: i32, m: usize, g: &Vec>, vis: &mut Vec, ans: &mut i32) { + if i >= m { + *ans = (*ans).max(s); + return; + } + for j in 0..m { + if !vis[j] { + vis[j] = true; + dfs(i + 1, s + g[i][j], m, g, vis, ans); + vis[j] = false; + } + } + } + + dfs(0, 0, m, &g, &mut vis, &mut ans); + ans + } +} +``` + +#### JavaScript + +```js +/** + * @param {number[][]} students + * @param {number[][]} mentors + * @return {number} + */ +var maxCompatibilitySum = function (students, mentors) { + let ans = 0; + const m = students.length; + const vis = Array(m).fill(false); + const g = Array.from({ length: m }, () => Array(m).fill(0)); + + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + + const dfs = function (i, s) { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + + dfs(0, 0); + return ans; +}; +``` + diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.cpp b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.cpp index d6d50bd267c66..f97bc30739b37 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.cpp +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.cpp @@ -3,10 +3,8 @@ class Solution { int maxCompatibilitySum(vector>& students, vector>& mentors) { int m = students.size(); int n = students[0].size(); - int g[m][m]; - memset(g, 0, sizeof g); - bool vis[m]; - memset(vis, 0, sizeof vis); + vector> g(m, vector(m)); + vector vis(m); for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < n; ++k) { @@ -15,15 +13,15 @@ class Solution { } } int ans = 0; - function dfs = [&](int i, int t) { - if (i == m) { - ans = max(ans, t); + auto dfs = [&](this auto&& dfs, int i, int s) { + if (i >= m) { + ans = max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } @@ -31,4 +29,4 @@ class Solution { dfs(0, 0); return ans; } -}; \ No newline at end of file +}; diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.go b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.go index 037d74c87612e..29d15d5147019 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.go +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.go @@ -2,30 +2,30 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) { m, n := len(students), len(students[0]) g := make([][]int, m) vis := make([]bool, m) - for i := range g { + for i, x := range students { g[i] = make([]int, m) - for j := range g { + for j, y := range mentors { for k := 0; k < n; k++ { - if students[i][k] == mentors[j][k] { + if x[k] == y[k] { g[i][j]++ } } } } var dfs func(int, int) - dfs = func(i, t int) { + dfs = func(i, s int) { if i == m { - ans = max(ans, t) + ans = max(ans, s) return } for j := 0; j < m; j++ { if !vis[j] { vis[j] = true - dfs(i+1, t+g[i][j]) + dfs(i+1, s+g[i][j]) vis[j] = false } } } dfs(0, 0) return -} \ No newline at end of file +} diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.java b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.java index 6b90ef3ec58ec..846589e6e499f 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.java +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.java @@ -1,8 +1,8 @@ class Solution { - private int[][] g; - private boolean[] vis; private int m; private int ans; + private int[][] g; + private boolean[] vis; public int maxCompatibilitySum(int[][] students, int[][] mentors) { m = students.length; @@ -11,7 +11,9 @@ public int maxCompatibilitySum(int[][] students, int[][] mentors) { for (int i = 0; i < m; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < students[i].length; ++k) { - g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0; + if (students[i][k] == mentors[j][k]) { + ++g[i][j]; + } } } } @@ -19,17 +21,17 @@ public int maxCompatibilitySum(int[][] students, int[][] mentors) { return ans; } - private void dfs(int i, int t) { - if (i == m) { - ans = Math.max(ans, t); + private void dfs(int i, int s) { + if (i >= m) { + ans = Math.max(ans, s); return; } for (int j = 0; j < m; ++j) { if (!vis[j]) { vis[j] = true; - dfs(i + 1, t + g[i][j]); + dfs(i + 1, s + g[i][j]); vis[j] = false; } } } -} \ No newline at end of file +} diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.js b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.js new file mode 100644 index 0000000000000..7b3eaabd29b39 --- /dev/null +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.js @@ -0,0 +1,38 @@ +/** + * @param {number[][]} students + * @param {number[][]} mentors + * @return {number} + */ +var maxCompatibilitySum = function (students, mentors) { + let ans = 0; + const m = students.length; + const vis = Array(m).fill(false); + const g = Array.from({ length: m }, () => Array(m).fill(0)); + + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + + const dfs = function (i, s) { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + + dfs(0, 0); + return ans; +}; diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.py b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.py index 3d5f2fbb7b68a..e7e6b713af5be 100644 --- a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.py +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.py @@ -2,23 +2,23 @@ class Solution: def maxCompatibilitySum( self, students: List[List[int]], mentors: List[List[int]] ) -> int: - def dfs(i, t): - if i == m: + def dfs(i: int, s: int): + if i >= m: nonlocal ans - ans = max(ans, t) + ans = max(ans, s) return for j in range(m): if not vis[j]: vis[j] = True - dfs(i + 1, t + g[i][j]) + dfs(i + 1, s + g[i][j]) vis[j] = False + ans = 0 m = len(students) - g = [[0] * m for _ in range(m)] - for i in range(m): - for j in range(m): - g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j])) vis = [False] * m - ans = 0 + g = [[0] * m for _ in range(m)] + for i, x in enumerate(students): + for j, y in enumerate(mentors): + g[i][j] = sum(a == b for a, b in zip(x, y)) dfs(0, 0) return ans diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.rs b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.rs new file mode 100644 index 0000000000000..0fe9b0e9e7069 --- /dev/null +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.rs @@ -0,0 +1,35 @@ +impl Solution { + pub fn max_compatibility_sum(students: Vec>, mentors: Vec>) -> i32 { + let mut ans = 0; + let m = students.len(); + let mut vis = vec![false; m]; + let mut g = vec![vec![0; m]; m]; + + for i in 0..m { + for j in 0..m { + for k in 0..students[i].len() { + if students[i][k] == mentors[j][k] { + g[i][j] += 1; + } + } + } + } + + fn dfs(i: usize, s: i32, m: usize, g: &Vec>, vis: &mut Vec, ans: &mut i32) { + if i >= m { + *ans = (*ans).max(s); + return; + } + for j in 0..m { + if !vis[j] { + vis[j] = true; + dfs(i + 1, s + g[i][j], m, g, vis, ans); + vis[j] = false; + } + } + } + + dfs(0, 0, m, &g, &mut vis, &mut ans); + ans + } +} diff --git a/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.ts b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.ts new file mode 100644 index 0000000000000..7be3e992112cd --- /dev/null +++ b/solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.ts @@ -0,0 +1,30 @@ +function maxCompatibilitySum(students: number[][], mentors: number[][]): number { + let ans = 0; + const m = students.length; + const vis: boolean[] = Array(m).fill(false); + const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < m; ++j) { + for (let k = 0; k < students[i].length; ++k) { + if (students[i][k] === mentors[j][k]) { + g[i][j]++; + } + } + } + } + const dfs = (i: number, s: number): void => { + if (i >= m) { + ans = Math.max(ans, s); + return; + } + for (let j = 0; j < m; ++j) { + if (!vis[j]) { + vis[j] = true; + dfs(i + 1, s + g[i][j]); + vis[j] = false; + } + } + }; + dfs(0, 0); + return ans; +}