求最大子串行之和

2021-07-04 23:35:39 字數 1293 閱讀 2340

摘要:給出乙個序列,求出其中連續的子串行中和最大的乙個。(如 1 3 -5 2 -1 4 5)最大子串行之和是2 -1 4 5

基本思路:

最簡單的辦法就是遍歷一邊序列,用變數thissum記錄遍歷過的元素之和,當thisum>0時,繼續相加.若thisum < 0,令thisum = 0,吧下乙個元素作為新的子串行的開頭.同時檢測所有thissum的最大值.這個演算法很容易理解:因為如果thissum>0,那麼加上後面的元素有可能產生最大值,但如果thissum<0,那麼包括它一定不會產生最大值.

儘管方法的效率是o(n),而且程式設計簡單,但是適用範圍只限於加法或者減法.這裡還有一種更通用的方法,分治演算法。

基本思路:將該序列分為2部分,求出左邊與右邊最大和,然後從中間開始向兩邊遍歷找出經過中間的最大子串行,將三個值進行比較。對於兩部分的也是遞迴的計算,時間界是o(nlogn);

推算時間界

t(n) = 2t(2/n) + o(n);不妨令n = 2^k,t(1) = 1;

t(2^k) = 2t(2^(k-1)) + 2^k,

->t(2^k)/2^k = t(2^(k-1))/(2^(k-1)) + 1;

所以t(2^k)/2^k = k;t(n) = nlogn;

#include "stdafx.h"

#include "stdlib.h"

#define positive 0

#define negative 1

int max3(int a, int b, int c)

//求最大子串行之和

static

int maxsub(const

int a,int left, int right)

center = (left + right)/2;

max_left = maxsub(a,left,center);

max_right = maxsub(a,center+1,right);

leftbodersum = 0;

rightbodersum = 0;

max_leftbodersum = 0;

max_rightbodersum = 0;

for (int i = center;i>=left;i--)

for (int i = center+1;i<=right;i++)

return max3(max_left,max_right,max_leftbodersum+max_rightbodersum);

}

求最大子串行之和

今天一下午在看sharepoint了,又有活幹,所以時間比較緊湊,於是想起了前些日子寫的求最大子串行之和,作為每日一小題吧,暫做自我安慰吧。求最大子串行之和,主要要注意他的效率,1,演算法複雜度是o pow n,2 int max sub int a,int size return max 2,演算...

演算法心得 求最大子串行之和

上面就是題目內容 首先這種需要不斷用當前累加值和之前的最大的累加值做比較的題目,一般都是用動態規劃來求解的,因為你需要不斷的修改結果的最優解,最後得出最好的答案,這道題的動態規劃應該如何寫呢 1 因為需要不斷用當前累加值和之前的最大的累加值做比較,所以需要兩個變數,乙個是當前值sumnum,乙個是歷...

求最大子陣列之和

在乙個有n個元素的陣列中,其中每個元素的值可正可負,在該陣列中求乙個連續子陣列,使得該陣列的和最大 拿到這個題首先想到的是暴力法,即暴力迴圈求所有陣列的和,因此可以求的該陣列的最大值,其時間複雜度為o n 3 時間複雜度較高,我們可以用分治法和動態規劃來做這道題。其中分治法時間複雜度為o n log...