算出每個子串行的和,即算出序列中第i個到第j個數的和(j>=i),並進行比較。
執行時間為o(n^3)
maxsum =0;
nums=
d=n=
int(
input
('輸入陣列長度:'))
for i in
range(0
,n):
k=int(
input
('輸入資料:'))
for i in
range(0
,len
(nums)):
for j in
range
(i,len
(nums)):
sum=
0 d.clear(
)for k in
range
(i,j+1)
:sum
+= nums[k]
#計算a[i]到a[j]的和)if
(sum
> maxsum)
: maxsum =
sum newn=
list
(d)print
(maxsum)
print
(newn)
第乙個演算法的第三個for迴圈中有大量不必要的重複計算,如:計算i到j的和,然而i到j-1的和在前一次的迴圈中已經計算過,無需重複計算,故該for迴圈可以去掉。
執行時間為o(n^2)
maxsum =0;
nums=
d=n=
int(
input
('輸入陣列長度:'))
for i in
range(0
,n):
k=int(
input
('輸入資料:'))
for i in
range(0
,n):
sum=
0 d.clear(
)for j in
range
(i,n)
:sum
+= nums[j]
#計算a[i]到a[j]的和)if
(sum
> maxsum)
: maxsum =
sum newn=
list
(d)print
(maxsum)
print
(newn)
把問題分成兩個大致相等的子問題,然後遞迴地對它們求解,然後將兩個子問題的解修補到一起並可能再做些少量的附加工作,最後得到整個問題的解。
如果把序列從中間分為兩部分,那麼最大子串行和可能在三處出現,要麼整個出現在輸入資料的左半部,要麼整個出現在右半部,要麼跨越分界線。前兩種情況可以遞迴求解,第三種情況的最大和可以通過求出前半部分(包括前半部分的最後乙個元素)的最大和以及後半部分(包含後半部分的第乙個元素)的最大和而得到,此時將兩個和相加。
執行時間o(n*logn)
nums=
d=n=
int(
input
('輸入陣列長度:'))
for i in
range(0
,n):
k=int(
input
('輸入資料:'))
sum = maxsum =0;
for j in
range(0
,n):
sum += nums[j]
if(sum > maxsum)
: maxsum = sum
elif
(sum <0)
: sum =
0 d.clear(
)print
('最大子串行為:'
+nums[d[0]
:d[-1]
+1])
print
('最大子串行和為:'
+maxsum)
最大子串行和的四種演算法
1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...
最大子串行和的四種求解方法
最大子串行和問題 include includeusing namespace std const int maxn 100 5 分治 int maxz int a,int x,int y 返回陣列左閉右開區間的最大和 v 0 r a m for int i m i y i return max m...
求最大子列和的四種演算法
問題描述 有乙個陣列有正有負,問起最大的連續子列的和是多少。求最大子列和 a1,a2,a3.an 方法1,暴力搜尋 int maxsubseqsum1 int a,int n return max int maxsubseqsum2 int a,int n return max 分治法 int ma...