高度なアルゴリズム - ディープ検索

以下は、パスOJを達成するために、対象コードであります

・例:

件名の説明:

整数nはk個の部分に、それぞれが空にすることはできません、いずれか2つが同じ(順序に関わらず)を有することができます。

たとえば、N = 7、K = 3は、以下の三つのサブ方法が同じであると考えられます。

1,1,5; 1,5,1; 5,1,1;

Q.どのように多くの異なるポイントシステム。出力整数、すなわち、異なるポイントシステム。

コードの実装:

1つの#include <cstdioを>
 2の#include <CStringの>
 3。の#include <アルゴリズム>
 4。 INT N-、K;
 5  INT F [ 210 ] [ 7 ];
 6  INT メイン()
 。7  {
 8。      scanfの(" %Dの%のD "、・N-、及び、K)
 。9      のmemset(F、0はsizeof(F)は、); // Fは、アレイ0に初期化され、
10      F [ 0 ] [ 0 ] = 1 ; // しかし1に最初にカレーを防止するために0に追加された
11      のためのInt I = 1 ; I <= N; Iは++)// 和ループ
12である         ためINT J = I; J <= N; J ++)// また円形の和、jがよいので、既にiは、循環されたように直接私が開始されてから
 13であり、         // 次の処理状態のために道を開くために、2つのサイクル
14              のためにINT X = 1 ; X <= K; X ++)// これは、プログラムサイクルの数である
15              {
 16                  F [J] [X] F = [J] [X] + F [JI] [X- 1 ]; // F [J]の合計数[X]プログラムの最大値である
 17。                 // JIは、例えば、繰り返されないようにするためである:115、これが発生した15 1.5 11
 18                  @は、連続の順に、X-1の最大値である
19              }
図20は、ある      のprintf(" %d個の\ N- "、F [N-] [K]); // 最大出力値
21は、     戻り 0 ;
 22れます }

・例2:

件名の説明:

  7月17日はMr.Wの誕生日は、ACM-木はM層Nπ誕生日ケーキを作成するには、このボリュームについて、それぞれの層がシリンダです。半径Ri、円筒高さHIで番号i(1≤i≤M)レイヤケーキ下から設定。私は<M、必要Riを> Riを+ 1、こんにちは>こんにちは+ 1をするとき。ケーキバタリングに、コスト削減が可能であり、我々は最も小さいQ.の面積ケーキ(除く底面下の最下層)の外面をしたいです

その結果、Q =Sπは、ケーキレシピプログラム(適切な値Ri及びHi)に、Sの最小値を見つけるために、所与のN及びMをプログラムします

(Q付加、上記のすべてのデータは、すべての正の整数です)

コードの実装:

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <アルゴリズム>
 4。 使用した 名前空間STD;      
 5  int型 N-、M、= 2E +ミネソタ州9。 ; // 分は、表領域の最小値、最大値に初期化されます
6  ボイド DFS(int型 D、int型 V、INT S、INT R、INT H)
 。7  // 半径r D層の高さHの表面積のD V Sとしてフロント層ケーキ体積
8  {
 9      IF(Dの==のM)/ / フロント層は、D M、我々は上に検索したプレゼンテーションで     
10       {
 11          IF(== N-V)S =ミネソタ。// 被験者の要件に沿ってボリュームは、最小表面積更新場合
12がある         返す ; // 戻り値
13である      }
 14を     IF(Vの+(R- 1)*(R- 1)*(H- 1)*(MD)< N-)リターン;
 15      / * 
16      1の場合は、現在のボリュームに加えて、各レイヤの最大値の後に、対象の必要量よりも小さい、旅の終わりを指示再帰
 17      2.私を自己となっている主な機能はGoogleの検索についてにトップ層の下の層よりも小さくなるように、ボトムアップ、
 18      3なぜ最大それは?我々は現在の層の半径に選択されるため、アップ小さい
 19      と、これは最大値であるように、同様に、私たちは層を乗算している
 20がある     * /  
21であり、     IF(MD + V> N-)リターン;           
 22れます     / * 
23     1.場合、旅行直接再帰の現在の最小体積プラスそれぞれ、被験者の必要量よりも大きく、終了後
 24      2.なぜ最小それは?私達の上の層は、トップのほとんどで、以下、より小さい層であるため、
 25が     1までの半径があり、それは以下の説明の最小は彼よりも大きくなりますがあるため、最小のですが、私たちダイレクト
 26      最小半径は1平方* 1 *(MD)、あなたはどこへ行く上位層の数不思議に思われるかもしれませんか?
図27は、     層1 * 1 * 1 = *(MD)MD =半径の自乗乗算することにより全体の高い高想定最小1である
 28      * / 
29      IF2 *(NV)/ R&LT S +> =ミネソタ州を)リターン;  
 30      / * 
31      あなたはまた、データをミネソタ大きな値であり、現在の最小、より途中の溶液プロセスを見つけた場合は、再帰的な旅の終わり
 32は     、このステップが最も重要なステップですが、私はここにどのように行うかわからない 
 33      * /  
34である     ためINT I = R- 1。 ; I> = MD; i-- 35      / *
図36は、     I(半径)層に半径]層の最小半径を保証するために最小電流よりも大きい
 37      大少なくとも一つ、すなわち、現在の最大半径の層を言うことである間解釈に被写体を1つのRADIUS -1
 38され     ている1、R&LT。
 39      最小値もより大きい又は半径の残りの層の数、裏面層ではない、さもなければ整数に等しい場合である
 40      例:
 41      第3層は(現在で、5層の合計カウント)、第三の層の半径が5であり、
 42      第2の層の最大半径は4であり、最小の単語である(5-3)2 =
 43である     ので、場合にのみだけ、この層上層、2以上で半径を有する
 44の     第2の層の半径、すなわち第一の層の半径が0未満である、少なくとも1以上次いで、1であれば
 45      、これは明らかに不可能である 
 46である     * / 
47      {
 48          のためにINT J = H - 1。 ; J> = MD; J、 49          / * 
50         J(高さ)の高さと、次いで一つの層は、この層の最小の高さということを保証するために最小電流よりも大きい
 51          半径同じトークンでは、それはここで説明されていない 
 52である         * /  
53であり         、{
 54は             IF((I * Iは、J + V <= N-)&&(S + * 2 * IがJ <* ミネソタ州))を
 55              / *を後ほど組み合わせの高さの半径と体積を見つけた場合は、n-等しい未満である* / 
56である             * / その面積比我々の以前のレコードが小さいことがあったが、その後* / 
57であり、                  (D + DFS 。1 V、+私は、J、S + * 2 IがJ、I、J *); / * 処理、すなわち再帰検索サブ状態を、* /  
58          }
 59      }
 60  }
 61は 、INT (メイン)
 62である {
 63れます      scanf関数(" %のDの%のD "、およびN-、&M);
 64       INT I = M、IがIをM * <= N-; I ++は65       / * 
66       1.Iは二乗半径、半径を表し(すなわち底面積)*の層(すなわち、ボリューム)の数
 67       に必要な容量よりも少なく、それが継続することができる
 68       毎に高さの層と少なくとも1層より大きい半径の下で、ため最初から2.I mを
 69で      あります底部半径と少なくともMの高さということ
 70       * / 
71である      {
 72          のためにINT ;私はJを* <= N-はJ ++ J = M 73がある         / * 
74          1.j高さを表し、高さが乗算します必要な容量よりも小さい底面積、継続することができる
 75          の各層の高さと半径の下に少なくとも1つのレベル1の比、であるので、最初から2.I mを
 76         すなわち、底部半径と少なくともMの高さ、である 
 77          * /  
78          {
 79              IF(I *はI + 2 * Iは、J <ミネソタ州*)/ * 我々は、唯一の着信更新された最小値よりも* /  
80              DFS(1。 私はJ *と*、IがI + * 2 * I *はJ、I、J)を、
 81              / * 
82              m番目の層からは、我々の以前の列挙底を起動するので、検索にボトムアップ
 83              注:( 5は別々に分析) 
 84              (1)表層1から始まり、 
 85              (2)体積半径*半径*高 
 86              最下層こと、領域(3)だけでなく、側面領域表面領域 
 87              (4)Iは半径を表し
 88              (5)高さJを表し 
 89              / *を 
90          }
 91である     }
 92      のprintf(" %d個の\ N- " ;、ミネソタ州)/ * 出力最小値* / 
93      リターン 0 ;
 94  }
 95  / * 
96  体積=π・R * R&LT * V H
 97  *側の領域A「= 2 R&LT * H *πの
 98  底面積=π・* R&LT * A R&LT
 99の * /

 

おすすめ

転載: www.cnblogs.com/juruohqk/p/10991656.html