2020年4月4日第2のソフトウェアエンジニアリングの求人

問題のI.説明


トピック

  そして最大連続サブアレイ(最大サブセグメント)

問題:

  所与nは整数(おそらく負)、[1]の配列からなる、[2 ]、[n]は、A [3]、... ,, 配列を見つけ、など[I] + [I + 1] + ... + [J]とサブセグメントの最大値。マックス{0、[I:与えられた定義は、負の整数とサブセグメント0、そのように定義され、必要な最適値である場合 ] + [I + 1] + ... + [J]} 、1 <= l <= J <= N
  例えば、([1]、[ 2]、[3]、[4]、[5]、[6])=( - 2、 11、-4,13、-5、-2)、および20サブセグメントの最大。

 

第二に、解決策のアイデアや方法


  この問題は、暴力、動的な計画法によって解くことができるクエリデータと研究の後、私が使用することを決めた分割統治戦略を問題を解決します。

アイデア:

  配列は、左境界中心の中間点=(左右)/ 2 +についての2つのセクションに分かれています。

  leftsum左セグメントの最大フィールドの再帰的計算。

  サブセグメントとrightsumの最大右セクションの再帰的計算。

  中心Aと呼ぶ。1最大、SLを、

  中心Aと呼ばN-最大とS2。

  マックス{leftsum、rightsum、S1 + S2}。

 

サブセグメント最大三の位置に表示されることがあります。

  A:左サブアレー 

  B:右サブアレイ 

  中間体を介してサブアレイの中央部:C

次のように具体的な解決策は以下のとおりです。

  。最大の計算と中央に左、leftSumを表します。中心から、各膨張段階の左、及びS1の現在の値を記録するために、現在及び前回と大きい場合には、更新されたS1は、位置左側に左側に拡張されています。 

  B。センタ+ 1を計算し、最大の右側に、rightSumで示さ。中央+ 1、各膨張段階、および最後の大より電流値が、それはS2の値を更新するならば、現在S2を算出するから、右側に右の位置に拡大されています。

  C。計算及びクロスボーダー。中心にそれぞれ両側、および計算された中心に。中心を通って連続値、S1 + S2値合計。これは、国境を越えたとあります。

  計算上に考え三つのケースが完了し、最後のステップは、最大服用、3つの値の最大値を比較することに価値をそれ。

 

三、C ++ソースコード


この問題は、C ++のソースコードは、サイトにアップロードされています:https://github.com/NisannTomo/TOMO/blob/master/2_1%20nMax

 

第四に、テストケース


 

 

おすすめ

転載: www.cnblogs.com/Nisanntomo/p/12630681.html
おすすめ