1. 程式人生 > >【6n】2*3n骨牌問題

【6n】2*3n骨牌問題

變換 bit names 題目 rip fine long long tdi ()

【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骨牌問題