[51nod1142] 棋子遍历棋盘

该博客讨论了如何解决一个棋子在M*N棋盘上从(1,1)出发遍历所有格子恰好1次并返回的题目。通过分析,提出问题等价于寻找哈密顿回路,并利用插头DP和矩阵乘法进行优化,尤其当N较小而M可能很大时。文章强调了在中间过程中不能转移到特定状态,只有在最后一步才允许。" 133556502,19671095,Vue.js实现滑动切换菜单栏教程,"['Vue', 'JavaScript', '前端框架']
摘要由CSDN通过智能技术生成

题目大意

一个M*N的棋盘, 有一个棋子每次可以向上下左右4个方向中的1个走1步,让这个棋子从(1,1)位置出发,走遍所有格子恰好1次,最后回到(1,1),有多少种不同的走法。由于方案数量巨大,输出数量Mod 10^9 + 7即可。

M≤ 109
N≤5

分析

题目相当于求一条哈密顿回路,那么可以不用管哪里出发(这个很显然)
发现N很小!很自然地可以往插头DP方面想。用括号序表示插头的联通状态即可。(手算一下发现当n=5,有用的状态只有21个)。
M却很大,但是21 * 21 * 21很小,所以可以矩阵乘法优化。
注意:由于是一条回路,在中间的部分不能转移到插头状态#####,只有最后f[m][n]才能转移到#####,也就是做矩阵乘法求出f[m-1][n],然后最后一行暴力。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=113,mo=1e9+7;

typedef long long LL;

int n,m,p,q,ans,id[799],tot,Sta[25];

s
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值