当前位置: 首页 > news >正文

Kimi LeetCode 3530. 有向无环图中合法拓扑排序的最大利润 Java实现

以下是 LeetCode 3530 有向无环图中合法拓扑排序的最大利润 的 Java 实现。

思路概述

- `n ≤ 22`,使用状压 DP(Bitmask DP)。
- `need[i]`:节点 `i` 的所有直接前驱的位掩码(必须排在 `i` 之前的节点集合)。
- `dp[mask]`:已经选了 `mask` 中这些节点,能获得的最大利润。
- 转移时,已选节点数为 `popcount(mask)`,下一个位置为 `pos = bitCount + 1`。枚举所有不在 mask 中且所有前驱都已选的节点 `i`,更新 `dp[mask | (1<<i)]`。
- 最终答案为 `dp[(1<<n) - 1]`。

复杂度

- 时间:`O(2^n · n)`,由于 `n ≤ 22`,约为 `2200` 万级别,可过。
- 空间:`O(2^n)`

完整代码

```java
class Solution {
public int maxProfit(int n, int[][] edges, int[] score) {
final int maxMask = 1 << n;

// need[i] = 节点 i 的所有前驱节点的位掩码
int[] need = new int[n];

// dp[mask] = 已选 mask 中节点时的最大利润
int[] dp = new int[maxMask];
Arrays.fill(dp, -1);
dp[0] = 0;

// 构建前驱掩码
for (int[] edge : edges) {
int u = edge[0];
int v = edge[1];
need[v] |= 1 << u;
}

for (int mask = 0; mask < maxMask; mask++) {
if (dp[mask] == -1) continue;

int pos = Integer.bitCount(mask) + 1; // 下一个位置(1-based)

for (int i = 0; i < n; i++) {
// i 不在 mask 中,且 i 的所有前驱都已在 mask 中
if ((mask & (1 << i)) == 0 && (need[i] & mask) == need[i]) {
int nextMask = mask | (1 << i);
dp[nextMask] = Math.max(dp[nextMask], dp[mask] + score[i] * pos);
}
}
}

return dp[maxMask - 1];
}
}
```

关键点说明

1. `need[i]` 的构建:`need[v] |= 1 << u` 表示节点 `u` 必须在 `v` 之前。转移条件 `(need[i] & mask) == need[i]` 等价于 `need[i]` 是 `mask` 的子集,即 `i` 的所有前驱都已处理。
2. 位置计算:`pos = bitCount(mask) + 1`,因为 `mask` 中已有 `bitCount(mask)` 个节点,下一个节点自然排在第 `bitCount + 1` 位。
3. DP 初始化:`dp[0] = 0`,其余为 `-1` 表示不可达。由于 `score[i] ≥ 1` 且 `pos ≥ 1`,利润恒为正,`-1` 作为不可达标记是安全的。
4. 枚举顺序:按 `mask` 从小到大枚举,保证每个状态只被前面的状态更新一次,无需递归或记忆化搜索。

http://www.jsqmd.com/news/1157650/

相关文章:

  • MelonLoader:Unity游戏Mod加载器的终极解决方案
  • doom3脚本部分
  • 【安全与故障排查】07-混沌工程落地:用故障注入提升系统韧性
  • 2026年新消息:青岛执行异议律师咨询选择指南与专业推荐 - 品牌鉴赏官2026
  • 7550稳压芯片24V应用为什么要串电阻?一文讲透LDO散热原理
  • 远程部署工具ZEQP-PSDeploy
  • MAX77654与PIC18LF46K40的嵌入式电源管理方案
  • 网盘直链下载助手终极指南:免费获取九大网盘真实下载链接的完整方案
  • STM32F042K6与CMT-8540S-SMT蜂鸣器实现嵌入式音频反馈方案
  • Go 语言初始化 MySQL 数据库实战指南:从零到生产环境部署
  • 猫抓浏览器插件:三步快速掌握网页视频下载的完整方案
  • 如何5分钟配置大麦网自动化抢票脚本:告别黄牛票的终极指南
  • ChatGPT GPTs商店上线前必做的7项合规检查:GDPR/数据主权/模型版权三重红线预警
  • S16.2第一性原理做产品(2):从《从0到1》看AI创业——在“能做“通胀时代,找到你的秘密
  • AGW 跨模态行人重识别:SYSU-MM01 数据集 80 Epoch 训练,Rank-1 达 77.8% 复现指南
  • 2026年河北车用润滑油实力厂家盘点:康耐琪为何备受关注? - 品牌鉴赏官2026
  • 影刀RPA Kubernetes自动化:Pod管理与日志采集
  • 终极指南:Tabby终端分屏功能如何彻底改变你的多任务工作流
  • nvidia-smi 命令行实战:5个高级查询技巧实现GPU监控自动化
  • SpringBoot常见问题:多环境配置的最佳实践
  • 2026年7月9日——武汉卫生间漏水到楼下怎么办?不用砸砖的方法 - 捷修防水
  • 计算机毕业设计之基于ssm的养老服务系统
  • 2026年7月最新北京欧米茄官方售后客服电话及服务网点地址查询 - 欧米茄官方服务中心
  • LayerDivider 终极指南:AI智能分层技术深度解析与实战应用
  • openeuler/dim_tools测试用例详解:确保基线生成工具可靠性
  • Equalizer APO:Windows音频优化的终极免费解决方案完整指南
  • 【Bug已解决】Claude permission denied / File write blocked by sandbox — Claude 沙箱权限拒绝解决方案
  • 基于STM32智能家居 烟雾温度火灾防盗报警 短信wifi蓝牙系统 成品123(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • BetterNCM安装器完整教程:3分钟为网易云音乐添加插件管理功能
  • 经常寄快递怎么省钱?内行人都在用的寄法 - 快递物流资讯