51Nod 1031 骨牌覆蓋

2021-09-05 09:53:55 字數 1258 閱讀 9154

傳送門

tags:斐波那契 遞推

題意:乙個2*n的長方形格仔,放入n個1*2的骨牌,有幾種方法?

解析:最初想著用分治演算法,一想可能還要考慮順序關係,是個死胡同。找了下規律,原來是斐波那契。原來我可以不把結果分成乙個整體,而是用遞推的方法,由前面的結果推出以後的結果。

分為兩種情況。一是豎著放乙個,其餘的放置方法就是f[n-1] ,二是橫著放兩個,則其餘的放置方法就是f[n-2] 。注意這兩種放置情況不互相交叉,所以不考慮豎著放兩個的情況。最終得到經典的 f[n] = f[n-1] + f[n-2] 。

**:

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define eps (1e-6)

#define ll long long

#define pi acos(-1.0)

#define all(a) (a.begin(),(a.end())

#define zero(a) memset(a,0,sizeof(a))

#define minus(a) memset(a,0xff,sizeof(a))

#define ios cin.tie(0) , cout.sync_with_stdio(0)

#define print(a,b) cout << "#" << (a) << " " << (b) << endl

#define debug(a,b) cout << "$" << (a) << " " << (b) << endl

#define line cout << "\n--------------------\n"

const ll inf = 1e18+100;

const int maxn = 1e3+5;

const int mod = 1e9+7;

int n;

ll f[maxn];

void solve()

cout << f[n];

return;

}int main()

51NOD 1031 骨牌覆蓋

1031 骨牌覆蓋 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 在2 n的乙個長方形方格中,用乙個1 2的骨牌排滿方格。問有多少種不同的排列方法。例如 2 3的方格,共有3種不同的排法。由於方案的數量巨大,只輸出 mod 10 9 7 的結果 輸入n n 10...

51nod 1031 骨牌覆蓋

在2 n的乙個長方形方格中,用乙個1 2的骨牌排滿方格。問有多少種不同的排列方法。例如 2 3的方格,共有3種不同的排法。由於方案的數量巨大,只輸出 mod 10 9 7 的結果 input 輸入n n 1000 output 輸出數量 mod 10 9 7 input示例 3 output示例 3...

51nod 1031 骨牌覆蓋

對於長為n來說,相當於n 1在後面加了乙個豎著放的,對於n 2來說相當於加了乙個2 2的格仔,但是對於乙個2 2的格仔本來有兩種畫法,由於豎著畫的那種和n 1的部分有重疊,所以只加一次即可,對於n 3,會發現三種擺法都在n 1和n 2的方法中出現過了,所以遞推公式就是f n f n 1 f n 2 ...