最近溫習和提公升一下演算法,發現了乙個很經典的問題 - 最大子串行和,看到這篇部落格,發現講的很容易理解,給大家分享一下。
**:給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
根據題意,我們必須明確,答案是乙個 連續的最大和子陣列,它和最大上公升子串行是不同的。
一般來說過,只要一旦判斷題目是有關動態規劃的題,第一步就是要找到他的最優子結構,至於怎麼找到最優子結構,只能刷題了,多刷點題目。
用陣列d[i] 來儲存 當前最大的連續子陣列,演算法的思想大體是這樣的,迴圈遍歷每個數,然後每次檢驗d[i-1] 是否大於零,只要大於零就 d[i] = d[i-1]+nums[i] ,如果d[i-1]<0 ,那麼直接d[i]=nums[i]
演算法核心: d[i] = d[i-1]>=0 ? d[i-1]+nums[i] : nums[i]
我在這裡下標按 1...n 比較好描述
按照上面演算法核心走一遍
[-2] d[1] = -2; 這步是直接初始化,在只有乙個數的時候,他就是最大連續的最大和子陣列
[-2,1] d[2] = 1; d[1] =-2 <0 所以前面的最大連續和是負數,加上它們肯定會變小,所以直接不要它
[-2,1,-3] d[3] = d[2]+nums[3] =-2; d[2] =1>=0 所以在i之前的最大連續是正數,肯定要加上它
[-2,1,-3,4] d[4] = 4; d[3] < 0
[-2,1,-3,4,-1] d[5] = d[4] +nums[5] = 3 ; d[4]>0
[-2,1,-3,4,-1,2] d[6] = d[5]+nums[6] =5; d[5]>0
[-2,1,-3,4,-1,2,1] d[7] = d[6]+nums[7] =6; d[6]>0
[-2,1,-3,4,-1,2,1,-5] d[8] = d[7]+nums[8] =1;d[7]>0
[-2,1,-3,4,-1,2,1,-5,4] d[9] = d[8]+nums[9] =5; d[8]>0
在這裡我們只需要遍歷d[i]陣列中最大數數即可,或者每一遍歷的使用m來記錄d[i] 的最大值,具體演算法過程如下
#include #include using namespace std;
int main()
m=d[0] = nums[0]; // 初始化第乙個 d[0]
for(int i=1;i上面**是我直接手敲的,沒過編譯器,但思想不會錯了, 這個時間複雜度為 o(n)
動態規劃 最大子串行
描述 1.從給定序列中找出連續最大子串行,滿足子串行的和為最大值,返回該最大值 2.從給定序列中找出連續最大子串行,滿足子串行的積為最大值,返回該最大值 思想 第一題首先申請乙個變數curmax表示當前子串行累計和,初始化為0,res表示當前所有子串行和的最大值,初始化為最小值int min。從序列...
和最大子串行 動態規劃
問題描述 對於乙個給定的長度為n的整數序列a,它的 子串行 的定義是 a中非空的一段連續的元素 整數 你要完成的任務是,在所有可能的子串行中,找到乙個子串行,該子串行中所有元素的和是最大的 跟其他所有子串行相比 程式要求你輸出這個最大值。輸入格式 輸入檔案的第一行包含乙個整數n,第二行包含n個整數,...
最大子串行和問題(動態規劃)
1.問題詳解 輸入一組整數,求出這組數字子串行和中最大值。也就是只要求出最大子串行的和。例如 序列 2 11 4 13 5 2,則最大子串行和為20。序列 6 2 4 7 5 3 2 1 6 9 10 2,則最大子串行和為16。2.解決辦法 這一類題目我們通常採用動態規劃來解決,即可以通過一次遍歷完...