ZJU2994 Tiling a Grid With Dominoes - 动态规划 变换矩阵

来源:互联网 发布:菲律宾的打击毒贩知乎 编辑:程序博客网 时间:2024/06/06 01:17

题目描述:

用1×2的多米诺骨牌,拼成4×w的矩形,总共有多少种方法?

分析:

经典题了,貌似我做过很多系列的这种题目,终于开窍了~

  1. /*
  2. ZJU2994 Tiling a Grid With Dominoes
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #define N 100
  7. #define L 20
  8. #define clr(a) memset(a,0,sizeof(a))
  9. int mx[L][L];
  10. void print(int a[],int n){
  11.     int i;
  12.     for(i=0;i<n;i++) printf("%d ",a[i]);
  13.     puts("");
  14. }
  15. int a2i(int a[]){
  16.     int i,x=0;
  17.     for(i=0;i<4;i++)
  18.         x|=a[i]<<i;
  19.     return x;
  20. }
  21. void i2a(int x,int a[]){   
  22.     int i;
  23.     for(i=0;i<4;i++)
  24.         a[i]=(x>>i)&1;
  25. }
  26. void fillB(int i,int a[],int k,int b[]){
  27.     int j,r;
  28.     if(k>=4){
  29.         j=a2i(b);
  30.         mx[i][j]=1;
  31.         return;
  32.     }
  33.     
  34.     if(a[k]==1){
  35.         b[k]=0;
  36.         fillB(i,a,k+1,b);
  37.     }
  38.     else{
  39.         if(k<3&&a[k+1]==0){
  40.             b[k]=b[k+1]=0;
  41.             fillB(i,a,k+2,b);
  42.         }
  43.         b[k]=1;
  44.         fillB(i,a,k+1,b);
  45.     }
  46. }
  47. void Matrix(void){
  48.     int i,j,k;
  49.     int a[L],b[L];
  50.     
  51.     for(i=0;i<16;i++){
  52.         i2a(i,a);
  53.         fillB(i,a,0,b);
  54.     }
  55. }
  56. int main()
  57. {
  58.     int i,j,k;
  59.     
  60.     clr(mx);
  61.     Matrix();
  62.     
  63.     
  64.     //DP
  65.     int f[N][L];
  66.     int n=30;
  67.     
  68.     clr(f);
  69.     f[0][0]=1;
  70.     for(i=1;i<=n;i++){
  71.         for(j=0;j<L-1;j++){
  72.             f[i][j]=0;
  73.             for(k=0;k<L-1;k++){
  74.                 if(mx[k][j])
  75.                 f[i][j]+=f[i-1][k];
  76.             }
  77.         }
  78.     }
  79.     
  80.     int T,Tn;
  81.     scanf("%d",&Tn);
  82.     for(T=1;T<=Tn;T++){
  83.         scanf("%d",&i);
  84.         printf("%d %d/n",T,f[i][0]);
  85.     }    
  86.     
  87.     return 0;
  88. }
  89.     
原创粉丝点击