DeepSeek    LeetCode 3276. 选择矩阵中单元格的最大得分 Java实现 这道题是 LeetCode 3276可以用状态压缩动态规划 (状压DP) 来解决。核心思路题目有两个核心限制1. 每行最多选一个因为行数 n 10可以用一个二进制整数位掩码表示哪些行已被占用。2. 选中的值必须互不相同可以从大到小考虑每个可能的数值1 到 100决定是否选择它。状态定义与转移· 状态定义dp[i][mask] 表示处理完数值 i 到 100 后已占用行状态为 mask 时能获得的最大得分。· 初始状态dp[101][mask] 0没有数值可选了。· 状态转移对于数值 i有两种选择1. 跳过dp[i][mask] dp[i1][mask]2. 选择如果某行 r 未被占用且包含数值 i则可以选它dp[i][mask] max(dp[i][mask], dp[i1][mask | (1 r)] i)· 最终答案dp[1][0]所有行都未被占用。Java 代码实现javaclass Solution {public int maxScore(ListListInteger grid) {int n grid.size();// 1. 预处理记录每一行包含了哪些数字// 数字范围是 1 到 100boolean[][] has new boolean[n][101];for (int i 0; i n; i) {for (int v : grid.get(i)) {has[i][v] true;}}// 2. 动态规划// dp[i][mask]: 处理完数值 i..100已选行状态为 mask 的最大得分int[][] dp new int[102][1 n];// 从大到小遍历所有可能的数值for (int i 100; i 1; i--) {for (int mask 0; mask (1 n); mask) {// 情况1: 不选择数字 idp[i][mask] dp[i 1][mask];// 情况2: 选择数字 i枚举它可以被安放在哪一行for (int r 0; r n; r) {// 行 r 未被占用 且 行 r 包含数字 iif ((mask (1 r)) 0 has[r][i]) {int newMask mask | (1 r);dp[i][mask] Math.max(dp[i][mask], dp[i 1][newMask] i);}}}}// 从数字1开始初始没有任何行被占用return dp[1][0];}}复杂度分析· 时间复杂度: O(100 * 2^n * n)其中 n 是矩阵行数n 10因此效率很高。· 空间复杂度: O(100 * 2^n)。其他解法思路· 回溯 剪枝对每行去重排序递归尝试选或不选通过剪枝优化。· 贪心 TreeMap从大到小处理数值用 TreeMap 记录每个值出现在哪些行用回溯处理冲突。上述状态压缩DP是这道题比较标准的解法逻辑清晰且易于实现。
💡
读完这篇文章,你可以带走什么

本文来自编程新知一线开发与建站实战沉淀:讲清原理、给出可复现步骤、标注避坑要点。看完后可以直接在你的项目或网站中落地验证。

编程新知内容团队
一线开发 · 建站实施 · 持续更新
由资深前端工程师、后端架构师与建站实施人员共同维护,坚持"真实案例 + 完整步骤 + 避坑指南"的内容准则。如果你在落地中遇到问题,欢迎联系我们交流。

想把这套方案用到自己的项目上?

编程新知提供技术答疑与网站建设一站式服务,欢迎联系我们获取针对性建议。

联系工程师
📚

系统学习该技术

进入对应栏目,从基础到进阶完整学习,配套案例与避坑指南。

前往栏目 →
🏗️

需要落地实施

企业建站、SEO 优化、服务器部署等需求,交给工程师一步到位。

了解服务 →
💬

还有疑问

技术难题或方案咨询,联系编程新知获取一对一的专业建议。

联系我们 →