1.タイトル説明
私たちは、大きな長方形をカバーするために横または縦に小さな長方形の2 * 1を使用することができます。なしnは2 * 1カバレッジの小さな長方形は、大きな長方形の2 * nを、どのように多くの方法の合計を重複しますか?
2.アイデアや方法
2×入れ:最初の二つの小さな長方形の吐出方法を入れ、その後、2×N個の矩形を想定)yは理解を容易に固定され、長いと、X * yが矩形の下に来て、幅×:(考え1又は1×2放電、唯一の正方形を形成するために、1×2,2×2に配置することができるの下に1×2に配置することを意味する場合。その後、我々は、2つの構造体に分けることができ、一つは最初の2×1の矩形であり、2つ目は、2×2の正方形です。2:広い二つのオプション1および2を有する、考慮されていない、あなたが質問がある変換することができる線分の長さNの総種の合成方法の数、1と組成のライン2の長尺です。
長さの線分の方法N =(残りの線分からなる方法を配置する第1工程後の長さ)+(メソッドから成る残りのセグメントを長くする最初の工程後2)、即ち、F(N)= F(N-1)+ F (N-2); 1,2,3,5,8 .... これは、フィボナッチ数に似ています。
3.C ++コアコード
3.1非再帰的な方法
1 クラスソリューション{ 2 公共: 3 INT rectCover(INT 数){ 4 であれば(数<= 2 ) 5 リターン番号; 6 INT = F1 1 。 7 INT = F2 2 。 8 int型の結果= 0 。 9 のためには、(int型 I = 3 ; iが<=番号; iが++ ){ 10 結果= F1 + F2と、 11 = F1 、F2。 12 F2 = 結果。 13 } 14 リターン結果。 15 } 16 }。
3.2再帰的な方法
以下のコードを再帰的な、しかし、高い時間複雑です。今収納スペース環境の多くの下では、それは時間を節約する必要があります。
1 クラスソリューション{ 2 公共: 3 INT rectCover(INT 数){ 4 であれば(数<= 3 ) 5 リターン番号; 6 リターン rectCover(number- 2)+ rectCover(number- 1 )。 7 } 8 }。
参考資料
https://blog.csdn.net/JMasker/article/details/86771720