6n2*3n骨牌问题

Posted qswx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6n2*3n骨牌问题相关的知识,希望对你有一定的参考价值。

【Problem description】

  已知3×2n个棋盘格子,试求用火柴棒覆盖所有格子的方法(一根火柴棒可覆盖2个格子)。如n=1时,有如下3种覆盖方法:

 

 

  编写一个程序,试对给出的任意一个n(0<n<1000),输出铺法的总数。【Algorithm design】

Developing program 动态规划

【Problem analysis】

和初级骨牌相差不了多少

某种意义上只是衍生的方式变了

 

通过观察题目的图

以两列格子为一个单位

每个单位都可以由上一个单位所有情况经过三种变换得来

但是特殊的是

可以出现像这样的情形:

 

也就是说 每个单位还可以由前面任意一个单位通过两种变换延伸出来(横路在最上或最下)

其实一开始讨论的

和也从属于这种情况

所以三种变换可以缩为一种

 

那么动规方程:

 

 

为了方便 设置一个前缀和sum

因为第一单位有三种情况 第零单位也要计入一个

所以sum初始为4

【Source code】

#include <bits/stdc++.h>

#define bnd 1001

#define ll long long

 

using namespace std;

 

Bign类型

 

bign dp[bnd],sum;

int col;

 

void input()

{

   cin>>col;

   dp[1]=3;

   sum=4;

   return;

}

 

void work()

{

   for(int i=2;i<=col;i++)

   {

      dp[i]=dp[i-1]+sum+sum;

      sum+=dp[i];

   }

   return;

}

 

void output()

{

   cout<<dp[col]<<endl;

   return;

}

 

int main()

{

   freopen("gupai.in","r",stdin);

   freopen("gupai.out","w",stdout);

   input();

   work();

   output();

   fclose(stdin);

   fclose(stdout);

   return 0;

}

 

以上是关于6n2*3n骨牌问题的主要内容,如果未能解决你的问题,请参考以下文章

确定性选择算法的递归关系

骨牌覆盖问题

c语言如何判断素数?

6N±1素数筛选法

质数——6N±1法

[HIHO1143]骨牌覆盖问题·一(矩阵快速幂,递推)