最大子串行和問題

2021-06-20 03:53:51 字數 1727 閱讀 4550

問題: 

給定一整數序列a1, a2,... an (可能有負數),求a1~an的乙個子串行ai~aj,使得ai到aj的和最大 

例如:整數序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取最大的那個。當然演算法複雜度會達到o(n^3)。

演算法一:

[cpp]view plain

copy

long

maxsubsum1( 

const

vector<

int> & a )  

if(thissum > maxsum) 

//判斷最大子串行

maxsum = thissum;   

}   

}   

return

maxsum;   

}  

這個演算法很簡單,i表示子串行起始下標,j表示子串行結束下標,遍歷子串行的開頭和結束下標,計算子串行的和,然後判斷最大子串行。很明顯的看出演算法複雜度是o( pow( n, 3 ) )

演算法本身很容易理解,而且很直觀的感覺在最內層for迴圈中做了很多無用操作,例如:

i = 0, j = 3

時,會計算

a[0] + a[1] +…+ a[3]

;而當i = 0, j = 4

時候又會計算

a[0] + a[1] +…a[4]

。演算法二:

[cpp]view plain

copy

long

maxsubsum2( 

const

vector<

int> & a )  

}   

return

maxsum;   

}  

這是乙個非常直觀的窮舉法(比上面的分析還有簡單些),而且沒有多餘重複的操作,複雜度為

o(n^2)

。其中,

thissum

表示a[i] + a[i+1] + … + a[j-1]

。演算法三:

分治法:最大子串行和可能出現在三個地方:整個出現在輸入資料的左半部分,整個出現在輸入資料的右半部分,或者跨越輸入資料的中部從而佔據左右兩個半部分。

**如下:

long maxsubsum3( const vector& a )//啟動函式

long maxsubsum3( const vector& a,int left,int right )

else 

}else

}//求出後半部分(包含第1個元素)最大值 

long maxrightbordersum = 0, rightbordersum = 0; 

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

}return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);}}

int max(int a,int b,int c)

if(b < c)

return max;

}

最大子串行和問題

問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...

最大子串行和問題

問題描述 給定乙個整數序列 可能有負數 求一子串行 記為l 使得該子串行所有元素之和最大。例 給定序列 2,11,4,13,5,2,則最大子串行和為20 11,4,13 方法一 遍歷窮舉 o n 2 略方法二 分治遞迴 o n logn 思路 將輸入序列l分為左右兩個子串行l1和l2,則l 只可能以...

最大子串行和問題

問題描述 求 2,11,4,13,5,2 的最大子串行和。方法一 使用3層for迴圈巢狀,窮舉式的嘗試所有的可能,如下 public class demo1 return maxsum public static void main string args system.out.println 最大...