最大子串行和

2021-08-06 03:42:35 字數 1073 閱讀 5088

求最大子串行的和是一道經典的動態規劃題目:給乙個陣列,求出陣列中和最大的子串行,輸出最大的和,有些題目還需要輸出子串行的開始和結束位置:

題目參考:

leetcode :

hdoj  :

思路:

動態規劃最重要的就是找到遞推關係,對於陣列中的每乙個數來說都有兩種選擇:和前面的數字一起構成子串行,或者單獨開始成為下一子串行的起始,比較這兩種狀態的大小就能確定每乙個數字的選擇,例如陣列[-2,1,-3,4,-1,2,1,-5,4]

-2 為陣列開始,單獨開始序列

1:若加入-2的序列,和為-1,若單獨成為新序列,則和為1,所以選擇和大的情況:1單獨開始序列

-3:若加入前面的序列,和為 1+(-3 )= -2,單獨成為新序列,和為-3,選擇加入前面的序列

4 : 加入前面的序列和為:1+(-3)+4 = 2,小於4,所以選擇單獨開始序列

以此類推,陣列中每個數字的選擇都可以確定下來,陣列中每個數字的選擇都是一種狀態,例如上例中-2,(1),(1,-3),(4),...為不同狀態,比較每個狀態的和,最大的和即為最求的和,最大的那個狀態就是最大的子串行:

class solution 

return maxsum;

}};

這種思路對於求連續子串行的其他問題也可以借鑑,例如leetcode 152最大子串行的乘積:

對於陣列中的每個陣列同樣有兩種選擇,但是在考慮如何選擇時要多考慮一種情況,如果乙個數字前面的序列乘積為正數。相乘後肯定小於數字本身,按照上面的思路就會選擇從這個數字單獨開始序列,這樣就會丟棄掉很多乘積為負數的狀態,在丟棄的這些狀態中,會有負負得正的情況,所以要設定變數記錄每次丟棄掉的負值狀態,當前數字若為負數時,判斷當前數字加入之前乘積為負值狀態後的結果是否更大,從而判斷當前數字的選擇:

class solution {

public:

int maxproduct(vector& nums) {

int tempmax = 1;

int tempmin = 1;

int res = int_min;

for(int i=0;i

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...

最大子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...

和最大子串行

時間限制 1 sec 記憶體限制 512 mb 提交 3 解決 3 提交 狀態 討論版 對於乙個給定的長度為n的整數序列a,它的 子串行 的定義是 a中非空的一段連續的元素 整數 你要完成的任務是,在所有可能的子串行中,找到乙個子串行,該子串行中所有元素的和是最大的 跟其他所有子串行相比 程式要求你...