本文討論的最大子串和指的是在乙個數字序列中,求出所有子串各數字之和最大
對於給定的乙個數字序列,這裡以為例說明(**示例則是普遍對於整型數字序列
先給出**,不懂的讀者再看講解
#include
using namespace std;
int a[
1010];
long
maxsubstr
(int a,
int n)
else
if(m>sum)
}return sum;
}int main (
) cout<<
"最大子串和:"
<<
maxsubstr
(a,n)
}
分析:
在本程式中運用的是動態規劃的思想,時間複雜度為o(n),空間複雜度為o(1),
核心思想:
利用中間變數m來更新我們的sum的最大值,
當m<=0時,表明在此下標以前的數字序列的和為負,那麼不管我們後邊的序列是何值,在加上m後必定不會增加,那麼此時我們應該捨棄m,將m更新為下乙個值
當m>0,後邊序列加上m都會使其增加,則我們更新m的值為此時的m加上下乙個值
最關鍵的是後邊的m和sum的比較,此步驟實現了動態規劃的思想,當我們檢測到m的值比此刻的sum更大時,表明出現了新的最大子串和,更新sum
如果我們需輸出最大子串和的每乙個組成元素的話,我們就需要引進兩個下標變數來記錄子串的起始和終止位置
最大子串和
要說明kadane演算法的正確性,需要兩個結論。首先,對於array 1 n 如果array i j 就是滿足和最大的子串,那麼對於任何k i k j 我們有array i k 的和大於0。因為如果存在k使得array i k 的和小於0,那麼我們就有array k 1 j 的和大於array i ...
最大子串和問題
問題 給定一組數字,求連續的字串的最大的和。這裡要注意題目中是子串和而不是子串行和。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的要求。如果求子序列,可直接把這組數字中的正數相加即可。最開始想著只要把這組數字中各個正數子串行分別求和,比較哪個大就行了,後來發現不對。比如 正數子串行分別為,其...
最大子串和問題(Maximum Subarray)
又乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...