75
75
76
76
### 方法一:预处理 + 回溯
77
77
78
- 预处理出每个学生与每个导师的兼容性评分,然后使用回溯的方法枚举所有的配对方案,求出最大的兼容性评分和 。
78
+ 我们可以先预处理出每个学生 $i$ 和导师 $j$ 之间的兼容性评分 $g [ i ] [ j ] $,然后使用回溯算法求解 。
79
79
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$ 为学生和导师的数量。
81
87
82
88
<!-- tabs:start -->
83
89
@@ -88,24 +94,24 @@ class Solution:
88
94
def maxCompatibilitySum (
89
95
self , students : List[List[int ]], mentors : List[List[int ]]
90
96
) -> int :
91
- def dfs (i , t ):
92
- if i = = m:
97
+ def dfs (i : int , s : int ):
98
+ if i > = m:
93
99
nonlocal ans
94
- ans = max (ans, t )
100
+ ans = max (ans, s )
95
101
return
96
102
for j in range (m):
97
103
if not vis[j]:
98
104
vis[j] = True
99
- dfs(i + 1 , t + g[i][j])
105
+ dfs(i + 1 , s + g[i][j])
100
106
vis[j] = False
101
107
108
+ ans = 0
102
109
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]))
107
110
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))
109
115
dfs(0 , 0 )
110
116
return ans
111
117
```
@@ -114,10 +120,10 @@ class Solution:
114
120
115
121
``` java
116
122
class Solution {
117
- private int [][] g;
118
- private boolean [] vis;
119
123
private int m;
120
124
private int ans;
125
+ private int [][] g;
126
+ private boolean [] vis;
121
127
122
128
public int maxCompatibilitySum (int [][] students , int [][] mentors ) {
123
129
m = students. length;
@@ -126,23 +132,25 @@ class Solution {
126
132
for (int i = 0 ; i < m; ++ i) {
127
133
for (int j = 0 ; j < m; ++ j) {
128
134
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
+ }
130
138
}
131
139
}
132
140
}
133
141
dfs(0 , 0 );
134
142
return ans;
135
143
}
136
144
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 );
140
148
return ;
141
149
}
142
150
for (int j = 0 ; j < m; ++ j) {
143
151
if (! vis[j]) {
144
152
vis[j] = true ;
145
- dfs(i + 1 , t + g[i][j]);
153
+ dfs(i + 1 , s + g[i][j]);
146
154
vis[j] = false ;
147
155
}
148
156
}
@@ -158,10 +166,8 @@ public:
158
166
int maxCompatibilitySum(vector<vector<int >>& students, vector<vector<int >>& mentors) {
159
167
int m = students.size();
160
168
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);
165
171
for (int i = 0; i < m; ++i) {
166
172
for (int j = 0; j < m; ++j) {
167
173
for (int k = 0; k < n; ++k) {
@@ -170,15 +176,15 @@ public:
170
176
}
171
177
}
172
178
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 );
176
182
return;
177
183
}
178
184
for (int j = 0; j < m; ++j) {
179
185
if (!vis[ j] ) {
180
186
vis[ j] = true;
181
- dfs(i + 1, t + g[ i] [ j ] );
187
+ dfs(i + 1, s + g[ i] [ j ] );
182
188
vis[ j] = false;
183
189
}
184
190
}
@@ -196,26 +202,26 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
196
202
m, n := len(students), len(students[0])
197
203
g := make([][]int, m)
198
204
vis := make([]bool, m)
199
- for i := range g {
205
+ for i, x := range students {
200
206
g[i] = make([]int, m)
201
- for j := range g {
207
+ for j, y := range mentors {
202
208
for k := 0; k < n; k++ {
203
- if students[i][ k] == mentors[j] [k] {
209
+ if x[ k] == y [k] {
204
210
g[i][j]++
205
211
}
206
212
}
207
213
}
208
214
}
209
215
var dfs func(int, int)
210
- dfs = func(i, t int) {
216
+ dfs = func(i, s int) {
211
217
if i == m {
212
- ans = max(ans, t )
218
+ ans = max(ans, s )
213
219
return
214
220
}
215
221
for j := 0; j < m; j++ {
216
222
if !vis[j] {
217
223
vis[j] = true
218
- dfs(i+1, t +g[i][j])
224
+ dfs(i+1, s +g[i][j])
219
225
vis[j] = false
220
226
}
221
227
}
@@ -225,6 +231,124 @@ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
225
231
}
226
232
```
227
233
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
+
228
352
<!-- tabs: end -->
229
353
230
354
<!-- solution: end -->
0 commit comments