最大兼容性评分和
难度:
标签:
题目描述
代码结果
运行时间: 51 ms, 内存: 16.0 MB
/*
题目思路:
利用Java Stream API来处理数据流,计算学生和导师之间的兼容性评分。通过构建掩码和递归函数来跟踪最佳分配和评分。
*/
import java.util.stream.IntStream;
public class Solution {
public int maxCompatibilitySum(int[][] students, int[][] mentors) {
return maxCompatibilitySumHelper(students, mentors, 0, 0, new int[students.length][1 << students.length]);
}
private int maxCompatibilitySumHelper(int[][] students, int[][] mentors, int studentIdx, int mask, int[][] dp) {
if (studentIdx == students.length) return 0;
if (dp[studentIdx][mask] != 0) return dp[studentIdx][mask];
dp[studentIdx][mask] = IntStream.range(0, mentors.length)
.filter(j -> (mask & (1 << j)) == 0)
.map(j -> {
int score = (int) IntStream.range(0, students[studentIdx].length)
.filter(k -> students[studentIdx][k] == mentors[j][k])
.count();
return score + maxCompatibilitySumHelper(students, mentors, studentIdx + 1, mask | (1 << j), dp);
}).max().orElse(0);
return dp[studentIdx][mask];
}
}
解释
方法:
此题解采用的是动态规划加状态压缩的策略。首先,计算学生与每位导师之间的兼容性评分,存储在二维数组 f 中,其中 f[i][j] 表示第 i 个学生与第 j 个导师的评分。接着,利用一个一维数组 dp 来存储状态压缩的动态规划结果,dp[i] 表示在状态 i 下的最大兼容性评分和。状态 i 是一个二进制数,表示当前已分配的导师集合。通过遍历所有的状态,并对于每个状态,在考虑分配下一个导师时更新 dp 数组,最终 dp 的最后一个元素即为最大兼容性评分和。
时间复杂度:
O(m^2 n + m * 2^m)
空间复杂度:
O(m^2 + 2^m)
代码细节讲解
🦆
如何理解状态压缩在此问题中的应用,并且它如何帮助提高算法的效率?
▷🦆
在动态规划数组 `dp` 中,`dp[i]` 的值是如何通过前一个状态推导出来的?具体是怎样的计算逻辑?
▷🦆
为什么在动态规划中使用位运算来表示状态?这种表示方式有什么优势和潜在的限制?
▷