关于Lego Blocks动态规划中无垂直断裂墙计数逻辑的疑问
乐高积木动态规划问题核心逻辑解析
问题背景
现有4种规格的乐高积木:111、112、113、114,每种数量无限。需构建高度为H、宽度为M的无孔洞实心墙,实心墙指无法沿任意竖直线拆分而不切割积木,积木仅水平放置。求构建方式总数?
关键变量定义
先明确两个核心变量的含义,这是理解逻辑的基础:
A(H,W):高度为H、宽度为W的所有墙体的总数量(包含可垂直拆分和不可拆分的所有情况)S(H,W):高度为H、宽度为W的实心墙数量(完全不可沿任意竖直线拆分的墙体)
对“最左侧断裂点”计数逻辑的解释
原描述中“Branch on the leftmost place where the wall is not connected”的本质是:按可拆分墙体的最左侧垂直断裂点,对所有可拆分墙体做无重复的分类计数。
对于任意一个可拆分的W宽度墙体,必然存在一个唯一的最小X(1≤X<W)——在这个X位置,墙体有一条完整的垂直裂缝,且X左侧的部分是完全不可拆分的实心墙(如果左侧还能拆分,那X就不是最左侧的断裂点了)。
基于这个分类规则,所有可拆分墙体的总数,就是所有可能X对应的「左侧实心墙数量 × 右侧任意墙体数量」的总和,即 Sum(S(H,X) * A(H,W-X))(X从1到W-1)。
公式推导逻辑
所有墙体总数A(H,W)可以被严格划分为两类:
- 本身就是不可拆分的实心墙:数量为
S(H,W) - 可拆分的墙体:数量为
Sum(S(H,X) * A(H,W-X))(X=1到W-1)
因此可以得到等式:
A(H,W) = S(H,W) + Σ(S(H,X) * A(H,W-X)) ,其中X∈[1, W-1]
将等式变形,就得到实心墙数量的计算公式:
S(H,W) = A(H,W) - Σ(S(H,X) * A(H,W-X)) ,其中X∈[1, W-1]
对您误解的澄清
您之前误以为总墙数是“所有W*H墙数与所有{W-X}*墙数的乘积之和加实心墙数”,这会导致重复计数——如果左侧用A(H,X)而非S(H,X),同一个墙体可能会在多个X值下被重复统计(比如一个在X=2和X=3都有断裂的墙体,会被X=2和X=3分别算一次)。而用S(H,X)作为左侧的数量,保证了X是该墙体的第一个断裂点,每个可拆分墙体只会被统计一次,完全避免了重复。
内容的提问来源于stack exchange,提问作者Blackwidow
相关产品推荐
相关产品推荐

