問題の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
第四に、テストケース