最大子串行和的四種演算法

2021-09-24 16:13:10 字數 2077 閱讀 2657

算出每個子串行的和,即算出序列中第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...