题目
原题链接:点击这里
大致题意:求解n*4的方格中,哈密顿回路的数量
思路
表示的方法还是跟插头dp的左右表示法一样,这边(打表)
注意起始状态和终止状态的合法性
代码实现
因为这题里面嵌套了高精度,所以建议先打低精度的正解,再打高精度
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define el '\n'
#define cl putchar('\n')
#define pb push_back
#define fir first
#define sec second
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vci;
typedef map<int,int> mii;
typedef mii::iterator mii_it;
typedef mii::reverse_iterator mii_rit;
const int N=1e3+10,M=1e3+10;
//这种里面套高精度的题目,建议先写完低精度再写高精度
int T,n,m,x,y,k;
int w[6][6]={
{1,0,1,1,0,0},{0,1,0,0,1,0},{0,1,0,0,1,0},{0,1,0,0,1,0},{1,0,1,1,0,1},{0,0,0,0,1,0}
};
int f[N][6][M];//设有1000位
void add(int a[],int b[]){
for(int i=0,t=0;i<M;i++){
t+=a[i]+b[i];
a[i]=t%10;
t/=10;
}
}
int main() {//求解哈密顿回路的条数
cin.tie(0);
cout.tie(0);
cin>>n;
f[1][1][0]=f[1][4][0]=1;//初始状态只有这两种状态合法
for(int i=2;i<n;i++){
for(int j=0;j<6;j++){
for(int k=0;k<6;k++){
if(w[k][j])add(f[i][j],f[i-1][k]);//因为w[k][j]就只有0和1两种状态
}
}
}
int res[M]={0};
add(res,f[n-1][0]),add(res,f[n-1][4]);//末尾状态就这两种合法方案
add(res,res);//等价与res*2,顺时针+逆时针
k=M-1;
while(k>0&&!res[k])k--;//去除前导零
for(int i=k;i>=0;i--)cout<<res[i];
cl;
//以下为低精度写法
// f[1][1]=f[1][4]=1;
// for(int i=2;i<n;i++){
// for(int j=0;j<6;j++){
// for(int k=0;k<6;k++){
// f[i][j]+=f[i-1][k]*w[k][j];
// }
// }
// }
// int res=0;
// res=f[n-1][0]+f[n-1][4];
// cout<<res*2;
}