最大子列和問題

2021-06-28 22:11:39 字數 1839 閱讀 1505

給定k個整數組成的序列,「連續子列」被定義為,其中 1 <= i <= j <= k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

輸入格式:

輸入第1行給出正整數 k (<= 100000);第2行給出k個整數,其間以空格分隔。

輸出格式:

在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

輸入樣例:

6

-2 11 -4 13 -5 -2

輸出樣例:
20
方法一:時間複雜度o(n^3)
#include #include using namespace std;

int a[100005];

int maxsum(int *a, int n)

if (thisum > max)}}

return max;

}int main()

cout << maxsum(a,k)<< endl;

}return 0;

}

方法二:時間複雜度o(n^2),在法一我們可以改進,k不是必要的。
#include

#include

using

namespace std;

int a[100005];

int maxsum(int *a, int n)}}

return max;

}int main()

cout << maxsum(a,k)<< endl;

}return

0;}

方法三:時間複雜度o(nlogn)
在法二里,我們可以想辦法再改進,將

o(n^2)改為

o(nlogn),這我們就想到了分治法。(先放一下,有時間寫)

在這裡,我們可以將序列分成兩部分left,right,那麼可能有以下三種情況:
1.最大值在左邊left.
2.最大值在右邊right.
3.最大值橫跨左右兩邊。
如下如:

int maxsum(int a[ ], int left, int right)

else

s2=0; rights=0;             //再求解s2

for (j=center+1; j<=right; j++)

sum=s1+s2;              //計算情況3的最大子段和 

if (sum

方法四:時間複雜度o(n)---最快的。
思路:thisum記錄當前子串行的和,值要它小於0,則重置為0,耶就是重頭來過,因為前面的子串行小於0,絕對會使後面的和減小,這不是我們要的。
#include

#include

using

namespace std;

int a[100005];

int maxsum(int *a, int n)

if (thisum < 0)

}return max;

}int main()

cout << maxsum(a,k)<< endl;

}return

0;}

最大子列和問題

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

最大子列和問題

給出乙個序列,求出最大子列和。演算法一 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時,...

最大子列和問題

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