【6n】2*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;

}

猜你喜欢

转载自www.cnblogs.com/qswx/p/9155689.html
N!
n
N*