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

DeepSeek LeetCode 1434.每个个戴不同帽子的方案数 public int numberWays(List<List<Integer>> hats)

这是一个典型的状态压缩DP问题,因为帽子数量最多40,人数最多10,我们不能以帽子作为状态,而应该以人作为状态。

解题思路

  1. 状态定义
    dp[i][mask]表示考虑前 i 顶帽子,已经分配帽子的人集合为 mask 的方案数
    但这样空间太大:40 × 2^10 = 40 × 1024 = 40960,可行

  2. 优化状态转移
    实际上我们可以反过来:让每个人选帽子
    对于每顶帽子,决定给哪个人(或者不给)

  3. 更高效方法

    • 先预处理每顶帽子 → 哪些人喜欢这顶帽子
    • dp[mask]表示当前分配了 mask 这些人时的方案数
    • 遍历每顶帽子,尝试分配给 mask 中还没有帽子的人
  4. 转移方程
    对于帽子 h,对于所有人 i (0…n-1):
    如果 i 喜欢 h 且 mask 中第 i 位为 0:

    new_mask = mask | (1 << i) dp[new_mask] += dp[mask]

代码实现

classSolution{privatestaticfinalintMOD=1_000_000_007;publicintnumberWays(List<List<Integer>>hats){intn=hats.size();// 人数// 最大帽子编号是40,我们索引从1到40intmaxHat=40;// 预处理:每顶帽子 -> 喜欢它的人(二进制位表示)List<Integer>[]hatToPeople=newList[maxHat+1];for(inti=0;i<=maxHat;i++){hatToPeople[i]=newArrayList<>();}for(intperson=0;person<n;person++){for(inthat:hats.get(person)){hatToPeople[hat].add(person);}}// dp[mask] 表示当前已分配帽子的人集合为mask的方案数int[]dp=newint[1<<n];dp[0]=1;// 遍历每顶帽子for(inthat=1;hat<=maxHat;hat++){if(hatToPeople[hat].isEmpty())continue;// 复制当前状态,避免同顶帽子重复分配int[]next=dp.clone();// 对于这顶帽子,尝试分配给每个可能的人for(intperson:hatToPeople[hat]){for(intmask=0;mask<(1<<n);mask++){if((mask&(1<<person))==0){// 这个人还没戴帽子intnewMask=mask|(1<<person);next[newMask]=(next[newMask]+dp[mask])%MOD;}}}dp=next;}// 所有人都分配了帽子returndp[(1<<n)-1];}}

复杂度分析

  • 时间复杂度:O(maxHat × 2^n × n)
    40 × 1024 × 10 ≈ 40万,实际上可以接受
  • 空间复杂度:O(2^n)

关键点

  1. 人少帽多→ 状态压缩人
  2. 逐帽分配→ 避免重复分配同一帽子
  3. 使用clone→ 确保同一顶帽子不会分配给多人

这个解法在 LeetCode 上可以通过,注意使用clone()或从大到小遍历 mask 来避免同帽子重复分配的问题。

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

相关文章:

  • 从‘看图说话’到‘看截图答题’:MMMU-Pro如何模拟真实用户场景来‘拷问’AI?
  • Vue3 项目集成 OnlyOffice 在线编辑 + 自定义插件开发(一)
  • DeepSeek LeetCode 1439. 有序矩阵中的第 k 个最小数组和 public int kthSmallest(int[][] mat, int k)
  • Python 装饰器高级应用指南
  • 手把手教你用DigNet从scRNA-seq数据构建基因调控网络(附乳腺癌案例解析)
  • PyTorch 2.8镜像高清案例:Stable Video Diffusion生成电影级运镜视频截图
  • 玻璃幕墙的自爆原因,以及安全隐患分析
  • GeographicLib 地理计算库终极指南:从WMM2025地磁模型到高精度坐标转换实战
  • c++ string字符串详解
  • 渗透测试中的优先级选择:以Misdirection靶机为例解析如何避免死磕
  • IndexTTS-2-LLM与Tacotron2对比:新一代TTS优势分析
  • DeepSeek linux-6.19/net/ipv6/addrconf.c 源码分析
  • 2025_NIPS_MASTER: Enhancing Large Language Model via Multi-Agent Simulated Teaching
  • 从Word2Vec到BERT:前馈网络(FFNN)在NLP预训练模型里扮演了什么角色?
  • 深入理解Millennium的FFI机制:TypeScript与Lua的完美交互
  • 未来5年最“钱“景岗位揭晓:AI产品经理,普通人如何从0到1逆袭?(内含3步进阶法+学习资源)
  • 2025_NIPS_HyperMARL: Adaptive Hypernetworks for Multi-Agent RL
  • Windows 10/11网络配置全攻略:手把手教你修改IPv4地址(含子网掩码自动计算)
  • 「游戏史话第1期」莉莉丝的远征:从“差评”打工人,到狂揽百亿的出海领军者
  • translategemma-4b-it多场景:单图翻译、批量图处理、API服务、桌面应用
  • C++递归算法使用;C++指针的使用;
  • AutoLisp实战:从零到一构建你的第一个绘图工具
  • 2026年质量好的宠物用品铁罐推荐品牌厂家 - 行业平台推荐
  • TG个人发卡机器人系统源码 支持双语言 二次开发版本
  • GPT-6爆表!200万Token+原生多模态,AI编码能力直接起飞!
  • 石榴解 × KnowFlow:一套面向 C 端用户的健康科普 AI 知识库解决方案,如何跑通落地
  • 豆包 Rocky Linux 10.1 环境下 100 道 grep 命令高频面试题 + 详细答案
  • BFF 架构决策与落地实践:从第一性原理到工程取舍
  • **发散创新:基于Go语言的轻量级Web容器实战与性能优化**在现代微服务架构中,**Web容器**不仅是应用运
  • 从翻译到定制:手把手教你用Buildroot 2025.05手册玩转嵌入式Linux BSP开发