★【动态规划】【状态压缩】【容斥原理】【ZJOI2009】多米诺骨牌

您所在的位置:网站首页 多米诺骨牌的视频有没有 ★【动态规划】【状态压缩】【容斥原理】【ZJOI2009】多米诺骨牌

★【动态规划】【状态压缩】【容斥原理】【ZJOI2009】多米诺骨牌

2024-07-17 13:43| 来源: 网络整理| 查看: 265

Description   有一个n×m的矩形表格,其中有一些位置有障碍。现在要在这个表格内放一些1×2或者2×1的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任何一个骨牌不能放到障碍上。并且满足任何相邻两行之间都有至少一个骨牌横跨,任何相邻两列之间也都至少有一个骨牌横跨。求有多少种不同的放置方法,注意你并不需要放满所有没有障碍的格子。 Input   第一行两个整数n;m。接下来n 行,每行m 个字符,表示这个矩形表格。其中字符“x” 表示这个位置有障碍,字符“.” 表示没有障碍。 Output   一行一个整数,表示不同的放置方法数mod 19901013 的值。 Sample Input 3 3 ... ... ... Sample Output 2 Hint 两种放置方法分别为 112 411 4.2 4.2 433 332 注意这里的数字只用于区分骨牌,不同的排列并不代表不同的方案。 【数据范围】 对于40% 的数据,满足1 ≤ n;m ≤ 8。 对于90% 的数据,满足1 ≤ n;m ≤ 14。 对于100% 的数据,满足1 ≤ n;m ≤ 15。

被这道题虐了一上午…… 首先考虑一个更简单一些的情况: 若没有“任何相邻两行、列之间都至少有一个骨牌横跨”的限制,那么问题就相当简单了(直接一个裸的状压DP就好了); 若只有行(任意两行之间)的跨立没有列的跨立,当然也很简单(用插头DP实现,保证每行结束都至少有一个插头指向下一行)。 再回到原问题中。 一种想法就是增加状态的信息,在转移的时候将相邻各列的相连情况记录下来,解决了列的横跨问题;并且用上面所说的方法解决行的横跨问题。(下面附代码。)这样做的复杂度是O(n·m·4^m),显然要超时。 所以需要继续寻找其他办法。 通常,我们很容易计算某两行(列)之间一定没有骨牌横跨的情况(只需把原问题分解为几个小的部分再把分别的结果相乘即可),所以这令人想到了容斥原理! 首先一个预处理(用状压DP实现),算出ini[U][D][L][R]即在U



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3