タイトル説明
HZは時折、それらの非コンピュータ科学の学生を点滅するために、いくつかの専門的な問題を取得します。テストグループが今日終了します後、彼はアップ話し:旧一次元パターン認識では、ベクトルは正の整数、問題の解決策であるときに最大と連続サブベクトルを計算する必要があることが多いです。ベクターは、負の数が含まれている場合は、それを補うだろう横に正の数を負の数が含まれている、と期待できますか?例えば:{6、-3、-2,7、-15,1,2,2}、及び8の最大連続サブベクトル(第3まで、0から始まります)。その最大連続サブ配列にして返し、あなたは彼が住んでだまされてはいけないのだろうか?(サブベクトルの長さは、少なくとも1です)
間違ったソリューション:
パブリック クラスFindGreatestSumOfSubArray {
公共 のint FindGreatestSumOfSubArray(INT []配列){
int型の結果= 0 。
もし(Array.lengthと== 1 ){
戻り配列[0 ]。
}
他{
ため(int型 i = 0; I <Array.lengthと; iは++ ){
ための(int型 J = 0; J <Array.lengthと; J ++ ){
int型の和= 0 。
一方(iは< j)を{
和 + = 配列[i]は、
}
もし(合計> 結果){
結果 = 和。
}
}
}
}
戻り値の結果;
}
正しい問題解決のアイデア:
動的計画法を用いて
F(I):アレイの[i]は同じサブアレイの構成要素の相対位置、サブアレイと最大値の最後の要素であります
F(I)= MAX(F(I-1)+配列[i]は、配列[i])と
RES:すべてのサブアレイと最大
RES = MAX(RES、F(I))
[6、-3、-2、7、-15、1、2、2]の配列
初期状態:
F(0)= 6
RES = 6
I = 1:
F(1)= MAX(F(0)-3、-3)= MAX(6-3,3)= 3
RES = MAX(F(1)、RES)= MAX(3,6)= 6
I = 2:
F(2)= MAX(F(1)-2、-2)= MAX(3-2、-2)= 1
RES = MAX(F(2)、RES)= MAX(1,6)= 6
I = 3:
F(3)= MAX(F(2)+7,7)= MAX(1 + 7,7)= 8
RES = MAX(F(2)、RES)= MAX(8,6)= 8
I = 4:
F(4)= MAX(F(3)-15、-15)= MAX(8-15、-15)= - 7
RES = MAX(F(4)、RES)= MAX(-7,8-)= 8
等々
8つのRESの最終値
public int FindGreatestSumOfSubArray(int[] array) { int res = array[0]; //记录当前所有子数组的和的最大值 int max=array[0]; //包含array[i]的连续数组最大值 for (int i = 1; i < array.length; i++) { max=Math.max(max+array[i], array[i]); res=Math.max(max, res); } return res; }