給定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。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測...