Skip to content
/ leetcode Public
  • Sponsor doocs/leetcode

  • Notifications You must be signed in to change notification settings
  • Fork 9k
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 288a8d6

Browse files
committedFeb 5, 2025·
feat: add solutions to lc problem: No.1947
No.1947.Maximum Compatibility Score Sum
1 parent 3550db3 commit 288a8d6

File tree

9 files changed

+451
-96
lines changed

9 files changed

+451
-96
lines changed
 

‎solution/1900-1999/1947.Maximum Compatibility Score Sum/README.md

+156-32
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,15 @@ tags:
7575

7676
### 方法一:预处理 + 回溯
7777

78-
预处理出每个学生与每个导师的兼容性评分,然后使用回溯的方法枚举所有的配对方案,求出最大的兼容性评分和
78+
我们可以先预处理出每个学生 $i$ 和导师 $j$ 之间的兼容性评分 $g[i][j]$,然后使用回溯算法求解
7979

80-
时间复杂度 $O(m!)$,其中 $m$ 为学生或导师的数量。
80+
定义一个函数 $\textit{dfs}(i, s)$,其中 $i$ 表示当前处理到第 $i$ 个学生,$s$ 表示当前的兼容性评分和。
81+
82+
在 $\textit{dfs}(i, s)$ 中,如果 $i \geq m$,表示所有学生都已经分配完毕,此时更新答案为 $\max(\textit{ans}, s)$。否则,我们枚举第 $i$ 个学生可以分配给哪个导师,然后递归处理下一个学生。过程中,我们用一个数组 $\textit{vis}$ 记录哪些导师已经被分配过,以避免重复分配。
83+
84+
我们调用 $\textit{dfs}(0, 0)$ 即可得到最大的兼容性评分和。
85+
86+
时间复杂度 $O(m!)$,空间复杂度 $O(m^2)$。其中 $m$ 为学生和导师的数量。
8187

8288
<!-- tabs:start -->
8389

@@ -88,24 +94,24 @@ class Solution:
8894
def maxCompatibilitySum(
8995
self, students: List[List[int]], mentors: List[List[int]]
9096
) -> int:
91-
def dfs(i, t):
92-
if i == m:
97+
def dfs(i: int, s: int):
98+
if i >= m:
9399
nonlocal ans
94-
ans = max(ans, t)
100+
ans = max(ans, s)
95101
return
96102
for j in range(m):
97103
if not vis[j]:
98104
vis[j] = True
99-
dfs(i + 1, t + g[i][j])
105+
dfs(i + 1, s + g[i][j])
100106
vis[j] = False
101107

108+
ans = 0
102109
m = len(students)
103-
g = [[0] * m for _ in range(m)]
104-
for i in range(m):
105-
for j in range(m):
106-
g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j]))
107110
vis = [False] * m
108-
ans = 0
111+
g = [[0] * m for _ in range(m)]
112+
for i, x in enumerate(students):
113+
for j, y in enumerate(mentors):
114+
g[i][j] = sum(a == b for a, b in zip(x, y))
109115
dfs(0, 0)
110116
return ans
111117
```
@@ -114,10 +120,10 @@ class Solution:
114120

115121
```java
116122
class Solution {
117-
private int[][] g;
118-
private boolean[] vis;
119123
private int m;
120124
private int ans;
125+
private int[][] g;
126+
private boolean[] vis;
121127

122128
public int maxCompatibilitySum(int[][] students, int[][] mentors) {
123129
m = students.length;
@@ -126,23 +132,25 @@ class Solution {
126132
for (int i = 0; i < m; ++i) {
127133
for (int j = 0; j < m; ++j) {
128134
for (int k = 0; k < students[i].length; ++k) {
129-
g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0;
135+
if (students[i][k] == mentors[j][k]) {
136+
++g[i][j];
137+
}
130138
}
131139
}
132140
}
133141
dfs(0, 0);
134142
return ans;
135143
}
136144

137-
private void dfs(int i, int t) {
138-
if (i == m) {
139-
ans = Math.max(ans, t);
145+
private void dfs(int i, int s) {
146+
if (i >= m) {
147+
ans = Math.max(ans, s);
140148
return;
141149
}
142150
for (int j = 0; j < m; ++j) {
143151
if (!vis[j]) {
144152
vis[j] = true;
145-
dfs(i + 1, t + g[i][j]);
153+
dfs(i + 1, s + g[i][j]);
146154
vis[j] = false;
147155
}
148156
}
@@ -158,10 +166,8 @@ public:
158166
int maxCompatibilitySum(vector<vector<int>>& students, vector<vector<int>>& mentors) {
159167
int m = students.size();
160168
int n = students[0].size();
161-
int g[m][m];
162-
memset(g, 0, sizeof g);
163-
bool vis[m];
164-
memset(vis, 0, sizeof vis);
169+
vector<vector<int>> g(m, vector<int>(m));
170+
vector<bool> vis(m);
165171
for (int i = 0; i < m; ++i) {
166172
for (int j = 0; j < m; ++j) {
167173
for (int k = 0; k < n; ++k) {
@@ -170,15 +176,15 @@ public:
170176
}
171177
}
172178
int ans = 0;
173-
function<void(int, int)> dfs = [&](int i, int t) {
174-
if (i == m) {
175-
ans = max(ans, t);
179+
auto dfs = [&](this auto&& dfs, int i, int s) {
180+
if (i >= m) {
181+
ans = max(ans, s);
176182
return;
177183
}
178184
for (int j = 0; j < m; ++j) {
179185
if (!vis[j]) {
180186
vis[j] = true;
181-
dfs(i + 1, t + g[i][j]);
187+
dfs(i + 1, s + g[i][j]);
182188
vis[j] = false;
183189
}
184190
}
@@ -196,26 +202,26 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
196202
m, n := len(students), len(students[0])
197203
g := make([][]int, m)
198204
vis := make([]bool, m)
199-
for i := range g {
205+
for i, x := range students {
200206
g[i] = make([]int, m)
201-
for j := range g {
207+
for j, y := range mentors {
202208
for k := 0; k < n; k++ {
203-
if students[i][k] == mentors[j][k] {
209+
if x[k] == y[k] {
204210
g[i][j]++
205211
}
206212
}
207213
}
208214
}
209215
var dfs func(int, int)
210-
dfs = func(i, t int) {
216+
dfs = func(i, s int) {
211217
if i == m {
212-
ans = max(ans, t)
218+
ans = max(ans, s)
213219
return
214220
}
215221
for j := 0; j < m; j++ {
216222
if !vis[j] {
217223
vis[j] = true
218-
dfs(i+1, t+g[i][j])
224+
dfs(i+1, s+g[i][j])
219225
vis[j] = false
220226
}
221227
}
@@ -225,6 +231,124 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
225231
}
226232
```
227233

234+
#### TypeScript
235+
236+
```ts
237+
function maxCompatibilitySum(students: number[][], mentors: number[][]): number {
238+
let ans = 0;
239+
const m = students.length;
240+
const vis: boolean[] = Array(m).fill(false);
241+
const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0));
242+
for (let i = 0; i < m; ++i) {
243+
for (let j = 0; j < m; ++j) {
244+
for (let k = 0; k < students[i].length; ++k) {
245+
if (students[i][k] === mentors[j][k]) {
246+
g[i][j]++;
247+
}
248+
}
249+
}
250+
}
251+
const dfs = (i: number, s: number): void => {
252+
if (i >= m) {
253+
ans = Math.max(ans, s);
254+
return;
255+
}
256+
for (let j = 0; j < m; ++j) {
257+
if (!vis[j]) {
258+
vis[j] = true;
259+
dfs(i + 1, s + g[i][j]);
260+
vis[j] = false;
261+
}
262+
}
263+
};
264+
dfs(0, 0);
265+
return ans;
266+
}
267+
```
268+
269+
#### Rust
270+
271+
```rust
272+
impl Solution {
273+
pub fn max_compatibility_sum(students: Vec<Vec<i32>>, mentors: Vec<Vec<i32>>) -> i32 {
274+
let mut ans = 0;
275+
let m = students.len();
276+
let mut vis = vec![false; m];
277+
let mut g = vec![vec![0; m]; m];
278+
279+
for i in 0..m {
280+
for j in 0..m {
281+
for k in 0..students[i].len() {
282+
if students[i][k] == mentors[j][k] {
283+
g[i][j] += 1;
284+
}
285+
}
286+
}
287+
}
288+
289+
fn dfs(i: usize, s: i32, m: usize, g: &Vec<Vec<i32>>, vis: &mut Vec<bool>, ans: &mut i32) {
290+
if i >= m {
291+
*ans = (*ans).max(s);
292+
return;
293+
}
294+
for j in 0..m {
295+
if !vis[j] {
296+
vis[j] = true;
297+
dfs(i + 1, s + g[i][j], m, g, vis, ans);
298+
vis[j] = false;
299+
}
300+
}
301+
}
302+
303+
dfs(0, 0, m, &g, &mut vis, &mut ans);
304+
ans
305+
}
306+
}
307+
```
308+
309+
#### JavaScript
310+
311+
```js
312+
/**
313+
* @param {number[][]} students
314+
* @param {number[][]} mentors
315+
* @return {number}
316+
*/
317+
var maxCompatibilitySum = function (students, mentors) {
318+
let ans = 0;
319+
const m = students.length;
320+
const vis = Array(m).fill(false);
321+
const g = Array.from({ length: m }, () => Array(m).fill(0));
322+
323+
for (let i = 0; i < m; ++i) {
324+
for (let j = 0; j < m; ++j) {
325+
for (let k = 0; k < students[i].length; ++k) {
326+
if (students[i][k] === mentors[j][k]) {
327+
g[i][j]++;
328+
}
329+
}
330+
}
331+
}
332+
333+
const dfs = function (i, s) {
334+
if (i >= m) {
335+
ans = Math.max(ans, s);
336+
return;
337+
}
338+
for (let j = 0; j < m; ++j) {
339+
if (!vis[j]) {
340+
vis[j] = true;
341+
dfs(i + 1, s + g[i][j]);
342+
vis[j] = false;
343+
}
344+
}
345+
};
346+
347+
dfs(0, 0);
348+
return ans;
349+
};
350+
```
351+
228352
<!-- tabs:end -->
229353

230354
<!-- solution:end -->

‎solution/1900-1999/1947.Maximum Compatibility Score Sum/README_EN.md

+159-31
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,17 @@ The compatibility score sum is 3 + 2 + 3 = 8.
7474

7575
<!-- solution:start -->
7676

77-
### Solution 1
77+
### Solution 1: Preprocessing + Backtracking
78+
79+
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.
80+
81+
Define a function $\textit{dfs}(i, s)$, where $i$ represents the current student being processed, and $s$ represents the current sum of compatibility scores.
82+
83+
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.
84+
85+
We call $\textit{dfs}(0, 0)$ to get the maximum compatibility score sum.
86+
87+
The time complexity is $O(m!)$, and the space complexity is $O(m^2)$. Here, $m$ is the number of students and mentors.
7888

7989
<!-- tabs:start -->
8090

@@ -85,24 +95,24 @@ class Solution:
8595
def maxCompatibilitySum(
8696
self, students: List[List[int]], mentors: List[List[int]]
8797
) -> int:
88-
def dfs(i, t):
89-
if i == m:
98+
def dfs(i: int, s: int):
99+
if i >= m:
90100
nonlocal ans
91-
ans = max(ans, t)
101+
ans = max(ans, s)
92102
return
93103
for j in range(m):
94104
if not vis[j]:
95105
vis[j] = True
96-
dfs(i + 1, t + g[i][j])
106+
dfs(i + 1, s + g[i][j])
97107
vis[j] = False
98108

109+
ans = 0
99110
m = len(students)
100-
g = [[0] * m for _ in range(m)]
101-
for i in range(m):
102-
for j in range(m):
103-
g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j]))
104111
vis = [False] * m
105-
ans = 0
112+
g = [[0] * m for _ in range(m)]
113+
for i, x in enumerate(students):
114+
for j, y in enumerate(mentors):
115+
g[i][j] = sum(a == b for a, b in zip(x, y))
106116
dfs(0, 0)
107117
return ans
108118
```
@@ -111,10 +121,10 @@ class Solution:
111121

112122
```java
113123
class Solution {
114-
private int[][] g;
115-
private boolean[] vis;
116124
private int m;
117125
private int ans;
126+
private int[][] g;
127+
private boolean[] vis;
118128

119129
public int maxCompatibilitySum(int[][] students, int[][] mentors) {
120130
m = students.length;
@@ -123,23 +133,25 @@ class Solution {
123133
for (int i = 0; i < m; ++i) {
124134
for (int j = 0; j < m; ++j) {
125135
for (int k = 0; k < students[i].length; ++k) {
126-
g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0;
136+
if (students[i][k] == mentors[j][k]) {
137+
++g[i][j];
138+
}
127139
}
128140
}
129141
}
130142
dfs(0, 0);
131143
return ans;
132144
}
133145

134-
private void dfs(int i, int t) {
135-
if (i == m) {
136-
ans = Math.max(ans, t);
146+
private void dfs(int i, int s) {
147+
if (i >= m) {
148+
ans = Math.max(ans, s);
137149
return;
138150
}
139151
for (int j = 0; j < m; ++j) {
140152
if (!vis[j]) {
141153
vis[j] = true;
142-
dfs(i + 1, t + g[i][j]);
154+
dfs(i + 1, s + g[i][j]);
143155
vis[j] = false;
144156
}
145157
}
@@ -155,10 +167,8 @@ public:
155167
int maxCompatibilitySum(vector<vector<int>>& students, vector<vector<int>>& mentors) {
156168
int m = students.size();
157169
int n = students[0].size();
158-
int g[m][m];
159-
memset(g, 0, sizeof g);
160-
bool vis[m];
161-
memset(vis, 0, sizeof vis);
170+
vector<vector<int>> g(m, vector<int>(m));
171+
vector<bool> vis(m);
162172
for (int i = 0; i < m; ++i) {
163173
for (int j = 0; j < m; ++j) {
164174
for (int k = 0; k < n; ++k) {
@@ -167,15 +177,15 @@ public:
167177
}
168178
}
169179
int ans = 0;
170-
function<void(int, int)> dfs = [&](int i, int t) {
171-
if (i == m) {
172-
ans = max(ans, t);
180+
auto dfs = [&](this auto&& dfs, int i, int s) {
181+
if (i >= m) {
182+
ans = max(ans, s);
173183
return;
174184
}
175185
for (int j = 0; j < m; ++j) {
176186
if (!vis[j]) {
177187
vis[j] = true;
178-
dfs(i + 1, t + g[i][j]);
188+
dfs(i + 1, s + g[i][j]);
179189
vis[j] = false;
180190
}
181191
}
@@ -193,26 +203,26 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
193203
m, n := len(students), len(students[0])
194204
g := make([][]int, m)
195205
vis := make([]bool, m)
196-
for i := range g {
206+
for i, x := range students {
197207
g[i] = make([]int, m)
198-
for j := range g {
208+
for j, y := range mentors {
199209
for k := 0; k < n; k++ {
200-
if students[i][k] == mentors[j][k] {
210+
if x[k] == y[k] {
201211
g[i][j]++
202212
}
203213
}
204214
}
205215
}
206216
var dfs func(int, int)
207-
dfs = func(i, t int) {
217+
dfs = func(i, s int) {
208218
if i == m {
209-
ans = max(ans, t)
219+
ans = max(ans, s)
210220
return
211221
}
212222
for j := 0; j < m; j++ {
213223
if !vis[j] {
214224
vis[j] = true
215-
dfs(i+1, t+g[i][j])
225+
dfs(i+1, s+g[i][j])
216226
vis[j] = false
217227
}
218228
}
@@ -222,6 +232,124 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
222232
}
223233
```
224234

235+
#### TypeScript
236+
237+
```ts
238+
function maxCompatibilitySum(students: number[][], mentors: number[][]): number {
239+
let ans = 0;
240+
const m = students.length;
241+
const vis: boolean[] = Array(m).fill(false);
242+
const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0));
243+
for (let i = 0; i < m; ++i) {
244+
for (let j = 0; j < m; ++j) {
245+
for (let k = 0; k < students[i].length; ++k) {
246+
if (students[i][k] === mentors[j][k]) {
247+
g[i][j]++;
248+
}
249+
}
250+
}
251+
}
252+
const dfs = (i: number, s: number): void => {
253+
if (i >= m) {
254+
ans = Math.max(ans, s);
255+
return;
256+
}
257+
for (let j = 0; j < m; ++j) {
258+
if (!vis[j]) {
259+
vis[j] = true;
260+
dfs(i + 1, s + g[i][j]);
261+
vis[j] = false;
262+
}
263+
}
264+
};
265+
dfs(0, 0);
266+
return ans;
267+
}
268+
```
269+
270+
#### Rust
271+
272+
```rust
273+
impl Solution {
274+
pub fn max_compatibility_sum(students: Vec<Vec<i32>>, mentors: Vec<Vec<i32>>) -> i32 {
275+
let mut ans = 0;
276+
let m = students.len();
277+
let mut vis = vec![false; m];
278+
let mut g = vec![vec![0; m]; m];
279+
280+
for i in 0..m {
281+
for j in 0..m {
282+
for k in 0..students[i].len() {
283+
if students[i][k] == mentors[j][k] {
284+
g[i][j] += 1;
285+
}
286+
}
287+
}
288+
}
289+
290+
fn dfs(i: usize, s: i32, m: usize, g: &Vec<Vec<i32>>, vis: &mut Vec<bool>, ans: &mut i32) {
291+
if i >= m {
292+
*ans = (*ans).max(s);
293+
return;
294+
}
295+
for j in 0..m {
296+
if !vis[j] {
297+
vis[j] = true;
298+
dfs(i + 1, s + g[i][j], m, g, vis, ans);
299+
vis[j] = false;
300+
}
301+
}
302+
}
303+
304+
dfs(0, 0, m, &g, &mut vis, &mut ans);
305+
ans
306+
}
307+
}
308+
```
309+
310+
#### JavaScript
311+
312+
```js
313+
/**
314+
* @param {number[][]} students
315+
* @param {number[][]} mentors
316+
* @return {number}
317+
*/
318+
var maxCompatibilitySum = function (students, mentors) {
319+
let ans = 0;
320+
const m = students.length;
321+
const vis = Array(m).fill(false);
322+
const g = Array.from({ length: m }, () => Array(m).fill(0));
323+
324+
for (let i = 0; i < m; ++i) {
325+
for (let j = 0; j < m; ++j) {
326+
for (let k = 0; k < students[i].length; ++k) {
327+
if (students[i][k] === mentors[j][k]) {
328+
g[i][j]++;
329+
}
330+
}
331+
}
332+
}
333+
334+
const dfs = function (i, s) {
335+
if (i >= m) {
336+
ans = Math.max(ans, s);
337+
return;
338+
}
339+
for (let j = 0; j < m; ++j) {
340+
if (!vis[j]) {
341+
vis[j] = true;
342+
dfs(i + 1, s + g[i][j]);
343+
vis[j] = false;
344+
}
345+
}
346+
};
347+
348+
dfs(0, 0);
349+
return ans;
350+
};
351+
```
352+
225353
<!-- tabs:end -->
226354

227355
<!-- solution:end -->

‎solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ class Solution {
33
int maxCompatibilitySum(vector<vector<int>>& students, vector<vector<int>>& mentors) {
44
int m = students.size();
55
int n = students[0].size();
6-
int g[m][m];
7-
memset(g, 0, sizeof g);
8-
bool vis[m];
9-
memset(vis, 0, sizeof vis);
6+
vector<vector<int>> g(m, vector<int>(m));
7+
vector<bool> vis(m);
108
for (int i = 0; i < m; ++i) {
119
for (int j = 0; j < m; ++j) {
1210
for (int k = 0; k < n; ++k) {
@@ -15,20 +13,20 @@ class Solution {
1513
}
1614
}
1715
int ans = 0;
18-
function<void(int, int)> dfs = [&](int i, int t) {
19-
if (i == m) {
20-
ans = max(ans, t);
16+
auto dfs = [&](this auto&& dfs, int i, int s) {
17+
if (i >= m) {
18+
ans = max(ans, s);
2119
return;
2220
}
2321
for (int j = 0; j < m; ++j) {
2422
if (!vis[j]) {
2523
vis[j] = true;
26-
dfs(i + 1, t + g[i][j]);
24+
dfs(i + 1, s + g[i][j]);
2725
vis[j] = false;
2826
}
2927
}
3028
};
3129
dfs(0, 0);
3230
return ans;
3331
}
34-
};
32+
};

‎solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,30 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
22
m, n := len(students), len(students[0])
33
g := make([][]int, m)
44
vis := make([]bool, m)
5-
for i := range g {
5+
for i, x := range students {
66
g[i] = make([]int, m)
7-
for j := range g {
7+
for j, y := range mentors {
88
for k := 0; k < n; k++ {
9-
if students[i][k] == mentors[j][k] {
9+
if x[k] == y[k] {
1010
g[i][j]++
1111
}
1212
}
1313
}
1414
}
1515
var dfs func(int, int)
16-
dfs = func(i, t int) {
16+
dfs = func(i, s int) {
1717
if i == m {
18-
ans = max(ans, t)
18+
ans = max(ans, s)
1919
return
2020
}
2121
for j := 0; j < m; j++ {
2222
if !vis[j] {
2323
vis[j] = true
24-
dfs(i+1, t+g[i][j])
24+
dfs(i+1, s+g[i][j])
2525
vis[j] = false
2626
}
2727
}
2828
}
2929
dfs(0, 0)
3030
return
31-
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class Solution {
2-
private int[][] g;
3-
private boolean[] vis;
42
private int m;
53
private int ans;
4+
private int[][] g;
5+
private boolean[] vis;
66

77
public int maxCompatibilitySum(int[][] students, int[][] mentors) {
88
m = students.length;
@@ -11,25 +11,27 @@ public int maxCompatibilitySum(int[][] students, int[][] mentors) {
1111
for (int i = 0; i < m; ++i) {
1212
for (int j = 0; j < m; ++j) {
1313
for (int k = 0; k < students[i].length; ++k) {
14-
g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0;
14+
if (students[i][k] == mentors[j][k]) {
15+
++g[i][j];
16+
}
1517
}
1618
}
1719
}
1820
dfs(0, 0);
1921
return ans;
2022
}
2123

22-
private void dfs(int i, int t) {
23-
if (i == m) {
24-
ans = Math.max(ans, t);
24+
private void dfs(int i, int s) {
25+
if (i >= m) {
26+
ans = Math.max(ans, s);
2527
return;
2628
}
2729
for (int j = 0; j < m; ++j) {
2830
if (!vis[j]) {
2931
vis[j] = true;
30-
dfs(i + 1, t + g[i][j]);
32+
dfs(i + 1, s + g[i][j]);
3133
vis[j] = false;
3234
}
3335
}
3436
}
35-
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* @param {number[][]} students
3+
* @param {number[][]} mentors
4+
* @return {number}
5+
*/
6+
var maxCompatibilitySum = function (students, mentors) {
7+
let ans = 0;
8+
const m = students.length;
9+
const vis = Array(m).fill(false);
10+
const g = Array.from({ length: m }, () => Array(m).fill(0));
11+
12+
for (let i = 0; i < m; ++i) {
13+
for (let j = 0; j < m; ++j) {
14+
for (let k = 0; k < students[i].length; ++k) {
15+
if (students[i][k] === mentors[j][k]) {
16+
g[i][j]++;
17+
}
18+
}
19+
}
20+
}
21+
22+
const dfs = function (i, s) {
23+
if (i >= m) {
24+
ans = Math.max(ans, s);
25+
return;
26+
}
27+
for (let j = 0; j < m; ++j) {
28+
if (!vis[j]) {
29+
vis[j] = true;
30+
dfs(i + 1, s + g[i][j]);
31+
vis[j] = false;
32+
}
33+
}
34+
};
35+
36+
dfs(0, 0);
37+
return ans;
38+
};

‎solution/1900-1999/1947.Maximum Compatibility Score Sum/Solution.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@ class Solution:
22
def maxCompatibilitySum(
33
self, students: List[List[int]], mentors: List[List[int]]
44
) -> int:
5-
def dfs(i, t):
6-
if i == m:
5+
def dfs(i: int, s: int):
6+
if i >= m:
77
nonlocal ans
8-
ans = max(ans, t)
8+
ans = max(ans, s)
99
return
1010
for j in range(m):
1111
if not vis[j]:
1212
vis[j] = True
13-
dfs(i + 1, t + g[i][j])
13+
dfs(i + 1, s + g[i][j])
1414
vis[j] = False
1515

16+
ans = 0
1617
m = len(students)
17-
g = [[0] * m for _ in range(m)]
18-
for i in range(m):
19-
for j in range(m):
20-
g[i][j] = sum(a == b for a, b in zip(students[i], mentors[j]))
2118
vis = [False] * m
22-
ans = 0
19+
g = [[0] * m for _ in range(m)]
20+
for i, x in enumerate(students):
21+
for j, y in enumerate(mentors):
22+
g[i][j] = sum(a == b for a, b in zip(x, y))
2323
dfs(0, 0)
2424
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
impl Solution {
2+
pub fn max_compatibility_sum(students: Vec<Vec<i32>>, mentors: Vec<Vec<i32>>) -> i32 {
3+
let mut ans = 0;
4+
let m = students.len();
5+
let mut vis = vec![false; m];
6+
let mut g = vec![vec![0; m]; m];
7+
8+
for i in 0..m {
9+
for j in 0..m {
10+
for k in 0..students[i].len() {
11+
if students[i][k] == mentors[j][k] {
12+
g[i][j] += 1;
13+
}
14+
}
15+
}
16+
}
17+
18+
fn dfs(i: usize, s: i32, m: usize, g: &Vec<Vec<i32>>, vis: &mut Vec<bool>, ans: &mut i32) {
19+
if i >= m {
20+
*ans = (*ans).max(s);
21+
return;
22+
}
23+
for j in 0..m {
24+
if !vis[j] {
25+
vis[j] = true;
26+
dfs(i + 1, s + g[i][j], m, g, vis, ans);
27+
vis[j] = false;
28+
}
29+
}
30+
}
31+
32+
dfs(0, 0, m, &g, &mut vis, &mut ans);
33+
ans
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
function maxCompatibilitySum(students: number[][], mentors: number[][]): number {
2+
let ans = 0;
3+
const m = students.length;
4+
const vis: boolean[] = Array(m).fill(false);
5+
const g: number[][] = Array.from({ length: m }, () => Array(m).fill(0));
6+
for (let i = 0; i < m; ++i) {
7+
for (let j = 0; j < m; ++j) {
8+
for (let k = 0; k < students[i].length; ++k) {
9+
if (students[i][k] === mentors[j][k]) {
10+
g[i][j]++;
11+
}
12+
}
13+
}
14+
}
15+
const dfs = (i: number, s: number): void => {
16+
if (i >= m) {
17+
ans = Math.max(ans, s);
18+
return;
19+
}
20+
for (let j = 0; j < m; ++j) {
21+
if (!vis[j]) {
22+
vis[j] = true;
23+
dfs(i + 1, s + g[i][j]);
24+
vis[j] = false;
25+
}
26+
}
27+
};
28+
dfs(0, 0);
29+
return ans;
30+
}

0 commit comments

Comments
 (0)
Please sign in to comment.