USACO 6.1.1 Postal Vans
题目大意:
求4*n的网格中哈密顿回路的条数。
简单题解:
基于连通性状态压缩的递推。
可以看我之前写的betsy的题解
可以看我之前写的betsy的题解
本题由于一维只有4,所以可以手动计算所有状态与转移。
具体参见代码。
我的代码:
1 /* 2 ID:t-x.h1 3 LANG:C++ 4 TASK:vans 5 */ 6 #include<cstdio> 7 #include<cstring> 8 FILE *fi=fopen("vans.in","r"),*fo=fopen("vans.out","w"); 9 const int MAXn=1000+9,NF=6; 10 // #### 11 // (()) ()() ()## (##) ##() #()# 12 const bool link[NF][NF]= 13 {{1,0,1,0,1,0}, 14 {0,1,0,1,0,0}, 15 {0,1,0,1,0,0}, 16 {1,0,1,0,1,1}, 17 {0,1,0,1,0,0}, 18 {0,0,0,1,0,0}}; 19 struct bign 20 { 21 char n[500]; 22 int l; 23 void set(int t) 24 { 25 memset(n,0,sizeof(n)); 26 n[0]=t; 27 l=1; 28 } 29 void operator += (const bign rhs) 30 { 31 if(rhs.l>l) 32 l=rhs.l; 33 for(int i=0;i<l;++i) 34 { 35 n[i]+=rhs.n[i]; 36 if(n[i]>9) 37 ++n[i+1],n[i]-=10; 38 } 39 if(n[l]) 40 ++l; 41 } 42 }f[2][NF]; 43 int main() 44 { 45 int n,i,j,k; 46 fscanf(fi,"%d",&n); 47 bign ans; 48 ans.set(0); 49 if(n!=1) 50 { 51 int old=1,now=0; 52 f[0][2].set(1); 53 f[0][3].set(1); 54 for(i=1;i<n;++i) 55 { 56 old^=1,now^=1; 57 for(j=0;j<NF;++j) 58 f[now][j].set(0); 59 for(j=0;j<NF;++j) 60 for(k=0;k<NF;++k) 61 if(link[j][k]) 62 f[now][k]+=f[old][j]; 63 } 64 ans+=f[now][2]; 65 ans+=f[now][4]; 66 } 67 for(i=ans.l-1;i>=0;--i) 68 fprintf(fo,"%d",ans.n[i]); 69 fputc(10,fo); 70 fclose(fi); 71 fclose(fo); 72 return 0; 73 }