2013-05-05 1 views
6

私はthis programming problemを解決しようとしていましたが、わからないのでオンラインで解決策を見つけました。私そのソリューションが機能する理由は本当に..どちらかを理解することはできませんSPOJ:M3TILEソリューションの説明

タスクは、* 3 *することができ、N(n >= 0、nは入力のみである)矩形が2で満たさ完全ことがどのように多くの方法で計算することです。 1ドミノ。

(赤線は、ドミノを表す):

Image

これは3 * 2の長方形が持つことができる3つの可能な組み合わせがあったことを私は文章を読んだとき、私は最初の一枚の紙の上に描いた、そして私が見たものでしたnが奇数の場合、解は0になります。なぜなら、長方形全体を埋める方法がないからです(1つの部分は常にドミノによって覆い隠されたままです)。

だから、nが偶数ならば3^nとなり、nが奇数ならば0と解があると思った。私は間違っていました。

私はここで、比較的簡単な解決策が見つかりました:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arr[31]; 

    arr[0]=1; 
    arr[1]=0; 
    arr[2]=3; 
    arr[3]=0; 

    for(int i = 4; i < 31; i++) { 
     arr[i] = arr[i-2] * 4 - arr[i-4]; //this is the only line i don't get 
    } 

    int n; 

    while(1) { 
     cin >> n; 

     if(n == -1) { 
      break; 
     } 

     cout << arr[n] << endl; 
    } 

    return 0; 
} 

なぜ、この仕事はありません!

答えて

18

T(n)を、2×1タイルで3×nのタイルをタイルする方法の数とします。また、2×1タイルで1つの角を取り除いた3×nボードをタイルする方法の数をP(n)とします。 nが十分に大きいとします(>= 4)。

次に、タイルを左から開始する方法(または、問題はありません)を検討してください。

左上隅を覆うタイルは、縦または横の2つの方法で配置できます。あなたはそれを縦置きした場合、左下隅をカバーするタイルは、タイルにP(n-1)方法の残りの部分を残した構成

| 
== 

を与えて、水平に配置する必要があります。水平に配置する場合は、左下隅のタイルを水平または垂直に配置できます。あなたは垂直に配置した場合、あなたは、以前と同じ状況にあるだけで反射され、あなたが水平に配置する場合、あなたは

== 
== 
== 

がタイルに3×(n-2)ボードをあなたに残して、それらの間で水平にタイルを配置する必要があります。

= 
| 

を与え、あなたを残して1削除(すでにカバー)コーナー(の左上を想定してみましょう)、あなたは垂直に下にタイルを配置することができますどちらかと3×(n-1)ボードを考慮今こうして

T(n) = T(n-2) + 2*P(n-1)    (1) 

、タイルに3×(n-2)ボードに、またはあなたが

= 
== 
== 

を与えて、水平にその下に2枚のタイルを配置することができ、その後、あなたは別のタイルHOを配置するしかありませんrizontally上部に、あなたを残し

3×(n-3)ボードマイナスコーナーで
=== 
== 
== 

P(n-1) = T(n-2) + P(n-3) 

は、nの代わりにn-2(1)を使用して、

T(n) = T(n-2) + 2*(T(n-2) + P(n-3)) 
    = 3*T(n-2) + 2*P(n-3)       (2) 

を追加しかし、我々はそれを参照してください

T(n-2) = T(n-4) + 2*P(n-3) 

または

2*P(n-3) = T(n-2) - T(n-4) 

(2)にそれを挿入すると再発

T(n) = 4*T(n-2) - T(n-4) 

q.e.d.を生み出します

+0

ニースの証拠! http://oeis.org/A001835 –

+0

@Daniel n = 0に対応する基本ケースについて説明できますか? –

+0

@ AtulSingh n = 0の場合、セルを一切持たないボードがあります。タイルを配置する方法は1つあります.3×0ボードに3,0 = 0のセルがあるため、0 /(2・1)= 0/2 = 0のタイルが必要です。 –

0
+0

リンクからいくつかのコンテンツを追加してください。 – Robert

+0

@Robertどういう意味ですか? –

+0

将来的にリンクが切断されると、この回答は冗長になります。 – Robert

0

スタート左とあなたは私が最初に黄色のタイル赤タイルを置くすべての場合には図 に示されているで終わるサブ問題のさまざまな種類と緑 からのタイルを配置します最後にタイルが配置されます。

X(N)= xと(N-2)+ケースから2 * F(N-1)(A)、(B)、(C)

F(N)= X(N- 1)+ f(n-2)となる。

f(n)をx(n)で表すことができます。

、さらなる説明のための画像を見

Tiles Problem - Image

出典:https://www.quora.com/Can-somebody-explain-solution-to-SPOJ-com-Problem-M3TILE