給定一個整數數組a,找到一個具有最大和的連續子數組(最少包含一個元素),返回其最大和。
用數組T[i] 來保存 當前最大的連續子數組,算法的思想大體是這樣的,循環遍歷每個數,然后每次檢驗d[i-1] 是否大於零,只要大於零就 T[i] = T[i-1]+a[i] ,如果d[i-1]<0 ,那么直接d[i]=a[i]
轉移方程: T[i] = T[i-1]>=0?T[i-1]+a[i]:a[i]
按照上面算法核心走一遍
[-2] T[1] = -2; 在只有一個數的時候,他就是最大連續的最大和子數組
[-2,1] T[2] = 1; T[1] =-2 <0 所以前面的最大連續和是負數,a[2]加上它們肯定會變小,所以直接不要它
[-2,1,-3] T[3] = T[2]+a[3] =-2; T[2] =1>=0 所以在i之前的最大連續是正數,肯定要加上它
[-2,1,-3,4] T[4] = 4; T[3] < 0
[-2,1,-3,4,-1] T[5] = T[4] +a[5] = 3 ; T[4]>0
[-2,1,-3,4,-1,2] T[6] = T[5]+a[6] =5; T[5]>0
[-2,1,-3,4,-1,2,1] T[7] = T[6]+a[7] =6; T[6]>0
[-2,1,-3,4,-1,2,1,-5] T[8] = T[7]+a[8] =1;T[7]>0
[-2,1,-3,4,-1,2,1,-5,4] T[9] = T[8]+a[9] =5; T[8]>0
只需再遍歷T[i],取出數組中最大數數即可,或者每一遍歷的使用m來記錄T[i] 的最大值,具體算法過程如下。
int getMaxSequnceSum(int[] a,int len){ int* T = new int[len]; T[0] = a[0]; for(int i=1;i<len;i++){ if(T[i-1]>0){ T[i] = a[i]+T[i-1]; }else{ T[i] = a[i]; } } int maxSequnceSum = T[0]; for(int i=1,i<len,i++){ if(T[i]>max){ maxSequnceSum = T[i] } }
delete [] T; return maxSequnceSum; }
以上兩個循環可以合並為一個。