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骨牌问题的主要内容,如果未能解决你的问题,请参考以下文章