遞迴演算法求最大的子陣列的和

2021-09-27 05:59:48 字數 1272 閱讀 8396

題目:輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。

例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列和18以及起始的下標2,6。 

分治策略,執行時間是nlogn

使用分治技術意味著我們要將子陣列劃分為兩個規模盡量相等的子陣列,也就是找到子陣列的**位置(比如mid),然後考慮求解兩個子陣列a[low..mid]和a[mid+1..high]。a[low..high]的任意連續子陣列a[i..j]所處的位置必然是以下三種情況之一:

(a)完全位於子陣列a[low..mid]中,因此low≤i≤j≤mid

(b)完全位於子陣列a[mid+1..high]中,因此mid≤i≤j≤high

(c)跨越了中點,因此low≤i≤mid≤j≤high

所以我們需要求解這三種情況的最大子陣列,然後再取最大值。a[low..mid]和a[mid+1..high]可以遞迴求解,剩下的就是訓中跨越中點的最大子陣列

#include #include #include #include void cross_sub(int a,int low,int mid,int high,int &max_left,int &max_right,int &sum)

} sum1=0;

for(int i=mid+1;i<=high;i++) }

sum=left_sum+right_sum;

}int max_sub(int a,int low,int high,int &max_left,int &max_right,int &sum)

else

if(left_sumcross_sum)

else

//if(left_sum}

}int main()

; int max_left,max_right,sum;

// 形參 int a,int low,int high,int &max_left,int &max_right,int &sum

max_sub(a,0,15,max_left,max_right,sum);

printf("max_left,max_right,sum is%d %d %d",max_left,max_right,sum);

}

求元素和最大的子陣列

1.題目要求 任意給出乙個整數的陣列,求出元素和最大的子陣列的和。要求時間複雜度為n。2.解析題目要求 要求出乙個陣列的最大子陣列和,若要求時間複雜度為n 則可一一求出,再求其最大值,利用兩次迴圈即可。但是若要求時間複雜度為n,只能進行一次遍歷,這便是難點所在。關鍵點在於負數,若全為正數,那麼顯然最...

演算法 求連續子陣列的最大和

題目描述 輸入乙個整數陣列,陣列中有乙個或者多個連續的字串,求所有字串的和的最大值。例如 輸入 1 2 3 10 4 7 2 5 輸出 18 解題思路1 動態規劃使用dp i 來儲存以i結尾的最大連續子陣列的和,只需要求出max dp i 即可得到最大連續子陣列的和。當dp i 1 第i個元素比第二...

求整數陣列中和最大的子陣列的和

鄭雲飛 韓亞華 這個問題的複雜性和不確定讓我們讓我們想到了列舉,求出每乙個子陣列的和,但這樣我們我們程式的時間複雜度 將會非常高,於是我們想把辦法簡化它。首先我們將陣列裡連續的正數和負數就和,這樣我們將得到乙個正負相間的 整數陣列。然後再對正整數陣列求最大子陣列,這樣最大子陣列必定是兩頭為正,有奇數...