Skip to content

Commit 0aa2781

Browse files
authored
feat: add solutions to lc problem: No.1947 (#4030)
No.1947.Maximum Compatibility Score Sum
1 parent 0b36f86 commit 0aa2781

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 -->

0 commit comments

Comments
 (0)