55
55
56
56
<!-- 这里可写通用的实现逻辑 -->
57
57
58
+ ** 方法一:预处理 + 回溯**
59
+
60
+ 预处理出每个学生与每个导师的兼容性评分,然后使用回溯的方法枚举所有的配对方案,求出最大的兼容性评分和。
61
+
62
+ 时间复杂度 $O(m!)$,其中 $m$ 为学生或导师的数量。
63
+
58
64
<!-- tabs:start -->
59
65
60
66
### ** Python3**
63
69
64
70
``` python
65
71
class Solution :
66
- def maxCompatibilitySum (
67
- self , students : List[List[int ]], mentors : List[List[int ]]
68
- ) -> int :
69
- def score (s , m ):
70
- res = 0
71
- for i in range (len (s)):
72
- res += 1 if s[i] == m[i] else 0
73
- return res
74
-
75
- m, n = len (students), len (students[0 ])
76
- scores = [[0 ] * m for _ in range (m)]
72
+ def maxCompatibilitySum (self , students : List[List[int ]], mentors : List[List[int ]]) -> int :
73
+ def dfs (i , t ):
74
+ if i == m:
75
+ nonlocal ans
76
+ ans = max (ans, t)
77
+ return
78
+ for j in range (m):
79
+ if not vis[j]:
80
+ vis[j] = True
81
+ dfs(i + 1 , t + g[i][j])
82
+ vis[j] = False
83
+
84
+ m = len (students)
85
+ g = [[0 ] * m for _ in range (m)]
77
86
for i in range (m):
78
87
for j in range (m):
79
- scores[i][j] = score(students[i], mentors[j])
80
- p = self .permute(list (range (m)))
81
- mx = 0
82
- for item in p:
83
- t = 0
84
- sidx = 0
85
- for midx in item:
86
- t += scores[sidx][midx]
87
- sidx += 1
88
- mx = max (mx, t)
89
- return mx
90
-
91
- def permute (self , nums ):
92
- def dfs (nums , i , res , path , used ):
93
- if i == len (nums):
94
- res.append(copy.deepcopy(path))
95
- return
96
- for j in range (len (nums)):
97
- if not used[j]:
98
- path.append(nums[j])
99
- used[j] = True
100
- dfs(nums, i + 1 , res, path, used)
101
- used[j] = False
102
- path.pop()
103
-
104
- res, path = [], []
105
- used = [False ] * len (nums)
106
- dfs(nums, 0 , res, path, used)
107
- return res
88
+ g[i][j] = sum (a == b for a, b in zip (students[i], mentors[j]))
89
+ vis = [False ] * m
90
+ ans = 0
91
+ dfs(0 , 0 )
92
+ return ans
108
93
```
109
94
110
95
### ** Java**
@@ -113,67 +98,121 @@ class Solution:
113
98
114
99
``` java
115
100
class Solution {
101
+ private int [][] g;
102
+ private boolean [] vis;
103
+ private int m;
104
+ private int ans;
105
+
116
106
public int maxCompatibilitySum (int [][] students , int [][] mentors ) {
117
- int m = students. length, n = students[0 ]. length;
118
- int [][] scores = new int [m][m];
107
+ m = students. length;
108
+ g = new int [m][m];
109
+ vis = new boolean [m];
119
110
for (int i = 0 ; i < m; ++ i) {
120
111
for (int j = 0 ; j < m; ++ j) {
121
- scores[i][j] = score(students[i], mentors[j]);
112
+ for (int k = 0 ; k < students[i]. length; ++ k) {
113
+ g[i][j] += students[i][k] == mentors[j][k] ? 1 : 0 ;
114
+ }
122
115
}
123
116
}
124
- int [] idx = new int [m];
125
- for (int i = 0 ; i < m; ++ i) {
126
- idx[i] = i;
127
- }
128
- int mx = 0 ;
129
- List<List<Integer > > p = permute(idx);
130
- for (List<Integer > item : p) {
131
- int t = 0 ;
132
- int sidx = 0 ;
133
- for (int midx : item) {
134
- t += scores[sidx][midx];
135
- ++ sidx;
136
- }
137
- mx = Math . max(mx, t);
138
- }
139
- return mx;
117
+ dfs(0 , 0 );
118
+ return ans;
140
119
}
141
120
142
- private int score (int [] s , int [] m ) {
143
- int res = 0 ;
144
- for (int i = 0 ; i < s. length; ++ i) {
145
- res += s[i] == m[i] ? 1 : 0 ;
121
+ private void dfs (int i , int t ) {
122
+ if (i == m) {
123
+ ans = Math . max(ans, t);
124
+ return ;
125
+ }
126
+ for (int j = 0 ; j < m; ++ j) {
127
+ if (! vis[j]) {
128
+ vis[j] = true ;
129
+ dfs(i + 1 , t + g[i][j]);
130
+ vis[j] = false ;
131
+ }
146
132
}
147
- return res;
148
133
}
134
+ }
135
+ ```
149
136
150
- private List<List<Integer > > permute (int [] nums ) {
151
- List<List<Integer > > res = new ArrayList<> ();
152
- permute(res, nums, 0 );
153
- return res;
154
- }
137
+ ### ** C++**
155
138
156
- private void permute (List<List<Integer > > res , int [] nums , int start ) {
157
- if (start == nums. length) {
158
- List<Integer > t = new ArrayList<> ();
159
- for (int e : nums) {
160
- t. add(e);
139
+ ``` cpp
140
+ class Solution {
141
+ public:
142
+ int maxCompatibilitySum(vector<vector<int >>& students, vector<vector<int >>& mentors) {
143
+ int m = students.size();
144
+ int n = students[ 0] .size();
145
+ int g[ m] [ m ] ;
146
+ memset(g, 0, sizeof g);
147
+ bool vis[ m] ;
148
+ memset(vis, 0, sizeof vis);
149
+ for (int i = 0; i < m; ++i) {
150
+ for (int j = 0; j < m; ++j) {
151
+ for (int k = 0; k < n; ++k) {
152
+ g[ i] [ j ] += students[ i] [ k ] == mentors[ j] [ k ] ;
153
+ }
161
154
}
162
- res. add(t);
163
- return ;
164
- }
165
- for (int i = start; i < nums. length; ++ i) {
166
- swap(nums, i, start);
167
- permute(res, nums, start + 1 );
168
- swap(nums, i, start);
169
155
}
156
+ int ans = 0;
157
+ function<void(int, int)> dfs = [ &] (int i, int t) {
158
+ if (i == m) {
159
+ ans = max(ans, t);
160
+ return;
161
+ }
162
+ for (int j = 0; j < m; ++j) {
163
+ if (!vis[ j] ) {
164
+ vis[ j] = true;
165
+ dfs(i + 1, t + g[ i] [ j ] );
166
+ vis[ j] = false;
167
+ }
168
+ }
169
+ };
170
+ dfs(0, 0);
171
+ return ans;
170
172
}
173
+ };
174
+ ```
171
175
172
- private void swap (int [] nums , int i , int j ) {
173
- int t = nums[i];
174
- nums[i] = nums[j];
175
- nums[j] = t;
176
- }
176
+ ### **Go**
177
+
178
+ ```go
179
+ func maxCompatibilitySum(students [][]int, mentors [][]int) (ans int) {
180
+ m, n := len(students), len(students[0])
181
+ g := make([][]int, m)
182
+ vis := make([]bool, m)
183
+ for i := range g {
184
+ g[i] = make([]int, m)
185
+ for j := range g {
186
+ for k := 0; k < n; k++ {
187
+ if students[i][k] == mentors[j][k] {
188
+ g[i][j]++
189
+ }
190
+ }
191
+ }
192
+ }
193
+ var dfs func(int, int)
194
+ dfs = func(i, t int) {
195
+ if i == m {
196
+ ans = max(ans, t)
197
+ return
198
+ }
199
+ for j := 0; j < m; j++ {
200
+ if !vis[j] {
201
+ vis[j] = true
202
+ dfs(i+1, t+g[i][j])
203
+ vis[j] = false
204
+ }
205
+ }
206
+ }
207
+ dfs(0, 0)
208
+ return
209
+ }
210
+
211
+ func max(a, b int) int {
212
+ if a > b {
213
+ return a
214
+ }
215
+ return b
177
216
}
178
217
```
179
218
0 commit comments