最大子串和問題

2021-08-08 08:54:29 字數 1126 閱讀 1118

問題

給定一組數字,求連續的字串的最大的和。

這裡要注意題目中是子串和而不是子串行和。

子串行只要求各元素的順序與其在陣列中一致,而沒有連續的要求。如果求子序列,可直接把這組數字中的正數相加即可。

最開始想著只要把這組數字中各個正數子串行分別求和,比較哪個大就行了,後來發現不對。比如:,正數子串行分別為,,其和分別為6和4,但事實上,1+2+3-1+3+1=9卻是最大的和。

這時要注意考慮兩種情況:

①給定的一組數字全為負數

②給定的一組數字至少有乙個正數

在第一種情況下,找出最大的負數,既是最大子串

在第二種情況時需要用到kadane演算法演算法:

①遍歷陣列, 在遍歷過程中, 將遍歷到的元素依次累加起來, 當累加結果小於或等於0時, 從下乙個元素開始,重新開始累加。

②累加過程中, 要用乙個變數(max_so_far)記錄所獲得過的最大值

③一次遍歷之後, 變數 max_so_far 中儲存的即為最大子片段的和值。

為什麼要這麼做呢?我們假設有一組數arr[0..n-1],假如有最大子串行arr[i..j] (0<=i<=j<=n-1),假如存在k(i<=k<=j),使得arr[i..k]為負數,那麼arr[i..k]+arr[k+1..j]一定小於arr[k+1..j],這與arr[i..j]是最大子串行矛盾,因此在遍歷的過程中,一旦sum<0那麼當前的子串行一定不可能是最大子串行。

//只需要返回最大的子串和

#include

using namespace std;

int find_max(int *a,int len)

else

}return max;

}

//需要知道最大子串和的起始位置

#include

using namespace std;

int find_max(int *a,int len,int &loc,int &end)

}else

}return max;

}

最大子串和問題(Maximum Subarray)

又乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...

經典問題 最大子串和

最近幾天好好的研究了一下這個問題。問題本身就不多說了,求一串數字中的所有子串中,和最大的乙個子串。例如 輸入 10 5 2 3 4 5 23 3 7 21 輸出 14 5 4 一 各種方法 方法1 maxsofar 0 for i 0 n for j i,n sum 0 for k i,j sum ...

最大子串問題

例如 2,4,7,20,1,1,1,1,10,1,1,1,10,10,10,10,25,10,10,10,10,10,10,300 首先,看到這個問題我們最先想到的一種方法就是 找到所有的子串,然後通過依次比較,找到最大的。接下來我們演示一下這種方法的 public int getmaxvalue ...