Loading

轮廓线dp

是什么?

轮廓线dp通常是在一个比较窄的棋盘上进行状态转移的方法

普通的dp很难处理这种dp,但是我们可以通过把参差不齐的轮廓线作为状态的一部分

怎么做?

我们先来看一道例题:UVA11270 Tiling Dominoes

题目的意思是说在一个\(n\times m\)的棋盘中排放一些\(1\times 2\)的骨牌,要求将棋盘摆满有几种方案。

我们可以轻松的想到\(O(n\times 2^m\times 2^m)\)的解法,但是这种方法一会超时,二会很难打。

我们考虑对这个东西进行优化。

raGWPH.png

我们可以发现只用统计这一些灰色格子的状态就可以进行转移了。

我们把这一些灰色的格子叫做轮廓线

接下来我们就考虑对于\((i,j)\)这个格子怎样进行转移??

  1. 这个格子向上放,这需要保证它上面的格子为空

  2. 这个格子向左放,这需要保证它左边的格子为空并且它上面的格子已经被填满了

  3. 这个格子不放,这需要保证它上面的格子被填满了

总结一下(\(\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

posted @ 2020-12-20 16:10  zhangwenxuan  阅读(1057)  评论(0)    收藏  举报