30.最大と連続サブアレイ
タイトル説明
HZは時折、それらの非コンピュータ科学の学生を点滅するために、いくつかの専門的な問題を取得します。テストグループが今日終了します後、彼が話した:旧一次元パターン認識では、ベクトルは正の整数であるときに最大と連続サブベクトルを計算する必要があることが多い、問題が解決しました。ベクターは、負の数が含まれている場合しかし、それは負の数を含んでおり、その横に正の数がそれを補うだろう期待できますか?例えば:{6、-3、-2,7、-15,1,2,2}、及び8の最大連続サブベクトル(アップ第三に、0から始まります)。その最大連続サブ配列にして返し、あなたは彼が住んでだまされてはいけないのだろうか?(サブベクトルの長さは、少なくとも1です)
アイデア:
動的プログラミング、DP [I]は、A [I]で表される最大連続サブシーケンスは終了します
シーケンスが終了時にA [i]が最大に設けられている場合、配列の長さは1、DP [I] = A [i]がある場合、
1、および前述の追加の配列A [i]が、すなわち、DP [I] = DP [I - 1] 系列長はA [i]がない+である場合、従って、転写式:DP = MAX(A [ i]は、DP [I - 1 ] + A [I])。
実際には、DPを見て、[I - 1]より大きく、0よりも大きい場合には、以前の配列とではなく、配列の前に合成されなければならない未満00又は0以上であるため、状態遷移式に変更することができる:DP [ ?I] = DP [I - 1]> 0 DP [I - 1] + A [I]:A [i]は、
1 パブリック クラスソリューション{ 2 公共 INT FindGreatestSumOfSubArray(INT []配列){ 3 // 動的プログラミング、DP [i]が最大と連続するサブシーケンスの終了時にA [I]で表される 。4 // DP [I] = MAX(A [I]、DP [I - 1] + A [I]) 5。 INT [] DP = 新しい新しい INT [Array.lengthとである]; 6。 DP [ 0 ] =配列[ 0 ]; 7 int型の最大= - 。1 << 30 ; 8 用(INT I = 1 ; Iは<Array.lengthとすること; I ++ ){ 9 // DP [I] = Math.max(配列[i]は、DP [I - 1] +配列[I])。 10 DP [I] = DP [I - 1 ]> 0?DP [I - 1 ] + 配列[I]:配列[i]は、 11 、最大=最大> DP [i]は?最大:DP [i]は、 12 } 13 リターンマックス。 14 } 15 }