轮廓线 dp 是一种和插头 dp 基本相同的东西,所以先看一下轮廓线 dp。
Tiling Dominoes
与状压 dp 不同的是,轮廓线 dp 是通过逐格转移来进行 dp 的。我们用三维 \(f_{i, j, k}\) 来表示 dp 状态。其中,\(i,j\) 表示当前进行到 \((i,j)\) 这个格子,\(k\) 表示轮廓线状态。具体的,在下面的情况中,\(k = \texttt{(11001001)}_2\)。
回到题目。
- 当这个格子被覆盖了,也就是 \(k\) 的第 \(j\) 位为 \(\texttt{1}\) 时,我们不能在格子上放任何多米诺骨牌。\(k\) 的第 \(j\) 位变成 \(\texttt{0}\)。
- 当这个格子没有被覆盖,也就是 \(k\) 的第 \(j\) 位为 \(\texttt{0}\):
- 我们可以竖着放。\(k\) 的第 \(j\) 位变成 \(\texttt{1}\)。
- 当 \(k\) 的第 \(j - 1\) 位之前选择的是竖着放的时候,说明本来 \(j - 1\) 是空闲的。我们可以把这个多米诺骨牌横过来。\(k\) 的第 \(j - 1\) 位变成 \(\texttt{0}\)。
- 这里我们没有暂时空闲的情况,因为暂时空闲给下一个格子放横的骨牌的情况已经被处理过了。
时间复杂度 \(\mathcal{O}(nm2^m)\)。这里转移是 \(\mathcal{O}(1)\) 的,这也是轮廓线 dp 的优势。
Guards In The Storehouse
这道题难点主要在于 dp 状态的设计和繁琐的转移。转移不多叙述。
设 \(f_{i, j, k, x, y}\) 表示当前在 \((i, j)\) 格子,当前 \(m\) 列每一列是否被占用的状态为 \(k\),这一行有没有被占用的布尔值为 \(x\),空一格的机会是否被使用的布尔值为 \(y\)。
标签:格子,texttt,dp,轮廓线,转移,空闲 From: https://www.cnblogs.com/yh2021shx/p/18090236