news 2026/4/19 1:38:17

【算法日记】Day 19 动态规划专题——状态压缩DP(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法日记】Day 19 动态规划专题——状态压缩DP(二)

Abstract#动态规划#状压DP#异或

1. 题目

  • 题目:LeetCode 473. 火柴拼正方形
  • 核心思路:将每根火柴看作一个物品,用二进制状态s表示火柴的使用情况。设边长为len,定义dp[s]表示状态s下,当前正在拼的边上已使用的长度对len取模的结果。这样dp[s]始终表示当前边的剩余容量。转移时,枚举所有未使用的火柴i,若dp[s] + matchsticks[i] <= len,则可以将 i 放入当前边,新状态为s | (1 << i),新边长为 (dp[s] + matchsticks[i]) % len。最终检查dp[(1 << n) - 1] == 0表示所有火柴刚好拼满四条边。
  • 复杂度:时间复杂度O ( n ⋅ 2 n ) O(n·2^n)O(n2n),空间复杂度O ( 2 n ) O(2^n)O(2n)

2. 代码

classSolution{public:boolmakesquare(vector<int>&matchsticks){inttotalLen=accumulate(matchsticks.begin(),matchsticks.end(),0);if(totalLen%4!=0)returnfalse;intlen=totalLen/4,n=matchsticks.size();vector<int>dp(1<<(n+1),-1);dp[0]=0;for(ints=1;s<(1<<n);++s){for(intk=0;k<n;++k){if((s&(1<<k))==0)continue;ints1=s&~(1<<k);if(dp[s1]>=0&&dp[s1]+matchsticks[k]<=len){dp[s]=(dp[s1]+matchsticks[k])%len;break;}}}returndp[(1<<n)-1]==0;}};

3. 心得

  • 状态压缩建模:火柴数量n <= 15,暗示可以用二进制整数表示火柴的选取状态,每一位代表一根火柴是否已被使用。这是处理小规模组合问题的常用技巧。

  • 状态转移分析:dp[s] 表示在状态 s 下,当前正在填充的边上已经放置的火柴总长度模边长后的余数。取模是为了在一条边填满后自动切换到下一条边(余数为0时表示该边已满,开始新边)。这种定义将四边的填充过程简化为单边的循环填充。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 1:31:33

MATLAB min函数进阶:从基础语法到多维度数据处理的实战解析

1. MATLAB min函数基础语法解析 第一次接触MATLAB的min函数时&#xff0c;我习惯性地以为它就是个简单的找最小值工具。直到在数据分析项目中踩了几个坑才发现&#xff0c;这个看似简单的函数藏着不少门道。先来看最基本的用法&#xff1a; A [3 7 2 8 5]; min_value min(A) …

作者头像 李华
网站建设 2026/4/19 1:28:35

OpenClaw(养龙虾) +关于Hadoop hive的Skills(Cloudera CDH、CDP)

前言 Kubernetes 本身并不复杂&#xff0c;是我们把它搞复杂的。无论是刻意为之还是那种虽然出于好意却将优雅的原语堆砌成 鲁布戈德堡机械 的狂热。平台最初提供的 ReplicaSets、Services、ConfigMaps&#xff0c;这些基础组件简单直接&#xff0c;甚至显得有些枯燥。但后来我…

作者头像 李华
网站建设 2026/4/19 1:28:29

STM32 QSPI双Flash实战:用HAL库轮询状态寄存器,确保两片W25Q256都就绪

STM32 QSPI双Flash实战&#xff1a;HAL库轮询状态寄存器的可靠性设计 在嵌入式系统开发中&#xff0c;外部存储器的稳定性和数据完整性往往是项目成败的关键。当我们需要扩展存储容量或实现数据镜像时&#xff0c;双Flash架构成为常见选择。然而&#xff0c;这种架构带来了新的…

作者头像 李华