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