棋盘(knight.in/knight.out)
有一个N*M的棋盘,要在上面摆上knight,每个格子可以放至多一个knight。
所有knight不能互相攻击,请问总共有多少可行的摆法?答案对1000000007取模。
【输入格式】
第一行个数t,表示测试的组数。
接下来t组,每组两个整数,n和m。
【输出格式】
一共t行,第i行表示第i组的答案。
【输入样例】
4
1 2
2 2
3 2
3 31415926
【输出样例】
4
16
36
933912086
【数据规模】
70% 数据满足m≤100。
100% 数据满足t≤10, n≤3, m≤109。
【解法】
n非常小,所以考虑状态压缩动态规划,每一行使用一个二级制串表示当前行的摆knight情况。用f[i][j][k]表示第i行,前一行为j,前一行的前一行为k时的方法总数,转移时枚举三行的状态,判断合法情况转移即可。
如果枚举每一行转移,可以得70分。如果将状态转移矩阵化,使用矩阵快速幂,可以通过全部测试数据。
【装压DP】【矩阵快速幂】DP special train T4 棋盘 题解
最新推荐文章于 2019-08-20 19:00:27 发布