轮廓线dp
是什么?
轮廓线dp通常是在一个比较窄的棋盘上进行状态转移的方法
普通的dp很难处理这种dp,但是我们可以通过把参差不齐的轮廓线作为状态的一部分
怎么做?
我们先来看一道例题:UVA11270 Tiling Dominoes
题目的意思是说在一个\(n\times m\)的棋盘中排放一些\(1\times 2\)的骨牌,要求将棋盘摆满有几种方案。
我们可以轻松的想到\(O(n\times 2^m\times 2^m)\)的解法,但是这种方法一会超时,二会很难打。
我们考虑对这个东西进行优化。
我们可以发现只用统计这一些灰色格子的状态就可以进行转移了。
我们把这一些灰色的格子叫做轮廓线
接下来我们就考虑对于\((i,j)\)这个格子怎样进行转移??
-
这个格子向上放,这需要保证它上面的格子为空
-
这个格子向左放,这需要保证它左边的格子为空并且它上面的格子已经被填满了
-
这个格子不放,这需要保证它上面的格子被填满了
总结一下(\(\bigoplus\)表示亦或,我在这里使用了滚动数组)
\(
\begin{cases}
dp[tmp][k \bigoplus p[j]] += dp[tmp \bigoplus 1][k], k \& p[j]\\
dp[tmp][k \| p[j - 1]] += dp[tmp \bigoplus 1][k], (j > 1) \&\& !(k \& p[j - 1]) \&\& (k \& p[j])\\
dp[tmp][k \| p[j]] += dp[tmp \bigoplus 1][k], (i > 1) \&\& \!(k \& p[j])
\end{cases}
\)
是不是很简单啊(bushi
制作不易,点个赞在走吧(QAQ)