對於這個問題我們給出三種演算法:
演算法1:t(n) = o(n^2)
一種笨辦法,兩個for迴圈,起點從下標0開始,每遍歷一次就加1再遍歷,一直加到n,這樣就得到了最後的結果,思路不難但是不算好。
**如下:
int
maxsubsequencesum
(int a,
int n)
}return maxsum;
}
演算法2:t(n) = o(n)
該演算法的優點是它只對資料進行一次掃瞄,一旦完成對a[ i ]的讀入和處理,就不再需要記憶它了,具有這種特性的演算法叫做聯機演算法(on-line algorithm)
**如下:
int
submax2
(int a,
int n)
return maxsum;
}
演算法3:t(n) = o(n logn)
分治法:將問題分成兩個大致相等的子問題,然後遞迴地對它們求解。
對於這個問題,最大子串行和可能在三處出現,將序列分成兩半部分,則最大子串行可能全在左半部分,可能全在右半部分,又或者它橫跨這兩部分。有了這個思路,我們就可以用遞迴來求解,雖然相對複雜,但是體現出了遞迴的威力。
**如下:
int
max3
(int a,
int b,
int c)
intmaxsubsum
(int a,
int left,
int right)
center =
(left + right)/2
;//找到中分點,遞迴求得兩邊子列的最大和
maxleftsum =
maxsubsum
(a,left,center)
; maxrightsum =
maxsubsum
(a,center+
1,right)
;//求跨分界線的最大子列和(這裡和聯機演算法有些相似)
maxleftbordersum = leftbordersum =0;
for(i = center; i >= left; i--
) maxrightbordersum = rightbordersum =0;
for(i = center+
1; i <= right; i++
)//maxleftbordersum+maxrightbordersum就是跨分界線的最大子列和,然後三者比較
return
max3
(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum)
;}
最大子串行和問題
問題 給定一整數序列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 最大...