Skip to content

Commit b96c5e2

Browse files
committed
feat: add solutions to lc problem: No.1947
No.1947.Maximum Compatibility Score Sum
1 parent 38a5c69 commit b96c5e2

File tree

6 files changed

+356
-261
lines changed

6 files changed

+356
-261
lines changed

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

Lines changed: 125 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:预处理 + 回溯**
59+
60+
预处理出每个学生与每个导师的兼容性评分,然后使用回溯的方法枚举所有的配对方案,求出最大的兼容性评分和。
61+
62+
时间复杂度 $O(m!)$,其中 $m$ 为学生或导师的数量。
63+
5864
<!-- tabs:start -->
5965

6066
### **Python3**
@@ -63,48 +69,27 @@
6369

6470
```python
6571
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)]
7786
for i in range(m):
7887
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
10893
```
10994

11095
### **Java**
@@ -113,67 +98,121 @@ class Solution:
11398

11499
```java
115100
class Solution {
101+
private int[][] g;
102+
private boolean[] vis;
103+
private int m;
104+
private int ans;
105+
116106
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];
119110
for (int i = 0; i < m; ++i) {
120111
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+
}
122115
}
123116
}
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;
140119
}
141120

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+
}
146132
}
147-
return res;
148133
}
134+
}
135+
```
149136

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++**
155138

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+
}
161154
}
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);
169155
}
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;
170172
}
173+
};
174+
```
171175
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
177216
}
178217
```
179218

0 commit comments

Comments
 (0)