Description
在n*n(n≤20)的方格棋盘上放置n个车(可以攻击所在行、列),有些格子不能放,求使它们不能互相攻击的方案总数。
Input
第一行为棋盘的大小n
第二行为障碍的数量m
第三行到第m+3为m个障碍
Output
总数
Sample Input
4
2
1 1
2 2
Sample Output
14
分析
状压DP还是比较难理解的知识点,很难检查,做的心态有点崩。
状态的表示是基于2进制的,用位运算去计算枚举和转移。p数组存的是2的n次方,二进制中的类似100…0的数。f数组就是存转移,初始化为1。
我们把每行压缩成一个二进制数,这样障碍直接可表示为:
a [ x ] + = n u m [ y − 1 ] a[x]+=num[y−1] a[x]+=num[y−1](a[x] 是存障碍的数组)
这样1表示有障碍,0表示无障碍。
然后枚举 f [ i ]