安全offer10を証明:垂直* 1 2小さな横の長方形又は大きな長方形の2 * nは、どのように多くの方法の合計をカバーするために?

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

おすすめ

転載: www.cnblogs.com/wxwhnu/p/11407400.html