1.問題詳解
輸入一組整數,求出這組數字子串行和中最大值。也就是只要求出最大子串行的和。例如:
序列:-2 11 -4 13 -5 -2,則最大子串行和為20。
序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,則最大子串行和為16。
2.解決辦法
這一類題目我們通常採用動態規劃來解決,即可以通過一次遍歷完成對於最大子串行以及相應位置座標的求解。
思路如下(假設存在正數):
(1)我們需要理解,如果乙個數是負數,那麼它不可能是起點,任何負數序列不可能為最大子串行和的序列。
(2)我們從第乙個元素往後遍歷,所記錄元素的陣列為a,對於這些輸入的陣列元素,我們設乙個和thissum,初始化為0。對應這個thissum,我們設定乙個記錄最大數值
和的元素maxsum,每次輸入乙個陣列元素,如果thissum比maxsum大,則進行更新。
(3)如果thissum<0,那麼前面這一段的最大值已經記錄完畢,存在maxsum裡面,造成thissum<0的原因是該元素<0,因此,在後面的元素的遍歷中,不能繼續使用該
元素,因此,將thissum置為0,繼續從該元素的下乙個元素為起點進行遍歷。
注意:很多同學可能不能理解,為什麼如果是中間一塊兒最大,還要從頭開始遍歷呢。我們可以想想,如果中間最大,那麼左右兩邊肯定不管擴大,兩邊的和都是負數。因此,當從頭到尾遍歷時,若thissum<0了,那麼則不繼續計入計算。
3.**(不要求記錄位置)
int max(const vector& a)
return maxsum;
}
4.**(要求輸出位置)
#include #include using namespace std;
int a[10005];
int main()
else//thissum<0(這裡的thissum沒有加上a[i]),更新此時的起點終點到下乙個座標位
if(thissum>maxsum|| (thissum==0&&en==n-1))//當取得thissum的值大於maxsum時,進行更新,記錄座標
}printf("%d %d %d\n",maxsum,a[star],a[en]);
}return 0;
}
最大子串行和(動態規劃)
最近溫習和提公升一下演算法,發現了乙個很經典的問題 最大子串行和,看到這篇部落格,發現講的很容易理解,給大家分享一下。給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,...
動態規劃初步,最大子串行和問題
測試樣例 6 2 11 413 5 2 include include include include include include define maxn 1000 using namespace std int n 動態規劃,重疊子問題,遞推寫法,開乙個dp陣列儲存子問題的答案,動態規劃兩個關...
動態規劃 最大子串行
描述 1.從給定序列中找出連續最大子串行,滿足子串行的和為最大值,返回該最大值 2.從給定序列中找出連續最大子串行,滿足子串行的積為最大值,返回該最大值 思想 第一題首先申請乙個變數curmax表示當前子串行累計和,初始化為0,res表示當前所有子串行和的最大值,初始化為最小值int min。從序列...