【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;
}
【6n】2*3n骨牌問題