最大子列和問題

2021-07-14 13:01:25 字數 1373 閱讀 2996

給出乙個序列,求出最大子列和。

演算法一:

long maxsum(int a,int n)

}return maxsum;

}

這是乙個窮舉的演算法,有三個巢狀的for迴圈,時間複雜度為o(n^3) 。在計算的時候有很多不必要的重複項,例如當i=0,j=3時,和的計算為:a[1]+a[2]+a[3];當i=0,j=4時,和為a[1]+a[2]+a[3]+a[4],a[1]+a[2]+a[3]的部分重合了。改進的措施是:保留之前的和,在之前和的基礎上加入新的值。

演算法二:

long maxsum(int a,int n)

}return maxsum;

}

這個演算法的時間複雜度為o(n^2),這個演算法在第乙個for迴圈的開始就將thissum置0,之後每加上乙個數的和就與maxsum相比較,大於就將thissum賦給maxsum。

演算法三

long maxsum(int a,int left,int right)

int center=(left+right)/2; //求出中間下標值

long maxleftsum=maxsum(a,left,center); //左子串行最大值

long maxrightsum=maxsum(a,center+1,right); //右子串行最大值

long maxleftboardersum=0,leftboardersum=0;

for(i=center;i>=left;i--) //從中間加確保左部分的最右乙個值能被加上

long maxrightboardersum=0,rightboardersum=0;

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

return max3(maxleftsum,maxrightsum,

maxleftboardersum+maxrightboardersum)); //返回三者最大值

}long max3(long a,long b,long c)

演算法三的時間複雜度為:o(nlogn) ,演算法三採用「分治策略」:把陣列分成左右兩個部分,最大子串行可能的出現的位置為左半部分,右半部分,橫跨左右的中間部分。左右兩個部分可以通過遞迴呼叫求出最大子串行和,中間部分需要將左半部分最大子串行和加右半部分子序列和,其中,左半部分最大子串行和要將左半部分的最右乙個值求上,右半部分子序列和要將最左乙個值求上。

演算法四

long maxsum(int a,int n)

}

演算法四的時間複雜度為o(n) ,思想是:加起來的和如果小於-1即把子序列和歸零,因為小於零的數不會讓後面加進來的數變大。

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...

最大子列和問題

描述 給定kkk個整數組成的序列,連續子列 被定義為n i 1 njn jn j 其中 1 i j k1 le i le j le k1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測...