Background
有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻)。求合法的方案总数。
Input
本题有多组测试数据,每组输入包含三个正整数n,m和k。
Output
对于每组输入,输出只有一个正整数,即合法的方案数。
Sample Input
2 2 3
4 4 1
Sample Output
0
16
solution
这道题一看状态非常多,就一定是状压。
我们很容易就能想到有以下几个状态:
- 每一行放了多少个旗子;
- 已经用了多少个旗子;
- 已经放的这些旗子能不能保证合法,即上下左右均不相邻。
我们先来考虑只有一行的情况,即转化为要求在这一行里边填充k个旗子,要求任意两个都不相邻,这个时候的dp应该怎么表示?这就很简单了,直接就是 dp[i][j][x] ,代表已经到了第i列,已经使用了j个旗子,而且当前第i列的状态就是x(当然这里x只能是0和1,这里0代表这个第i列没有放旗子,1就代表这个位置放了旗子)的总方案数,递推关系是怎么写?其实也很简单,
dp[i][j][0]=dp[i−1][j][0]+dp[i−1][j][1];