給出乙個長度為 n 的序列 a,選出其中連續且非空的一段使得這段和最大。
第一行是乙個整數,表示序列的長度 n。
第二行有 n 個整數,第 i個整數表示序列的第 i個數字 \(a_i\) 。
輸出一行乙個整數表示答案。
輸入
7輸出資料範圍2 -4 3 -1 2 -4 3
對於 40% 的資料,保證 n \(\leq\) 2 \(\times\)
\(10^3\)。
對於 100% 的資料,保證 n \(\leq\) 2 \(\times\)
\(10^5\),-\(10^4\)
\(\leq\)
\(a_i\)
\(\leq\)
\(10^4\)。
計算出每個子串行的和再選出其中最大的那乙個。(注意:根據這道題目的資料範圍來說,這個思路會tle)
#include#includeusing namespace std;
typedef long long int ll;
int main()
ll maxsum=a[1];
for(int i=1;i<=n;i++)//i代表子串行的左端點
cout《將乙個序列分成兩段,分別求兩個子串行的最大子串行和,再求出越過序列分界點的最大子串行和,那麼序列的最大子串行和一定是三個值中的最大值。
1)如何求兩個子串行的最大子串行和?
答:將這兩個子串行分別再分成兩段,當子串行中只有乙個數字的時候最大子列和就是這個數字,再遞迴返回就可以了。
2)如何求出越過序列分界點的最大子串行和?
答:從分界點左端掃瞄,維護出乙個leftmax;同理,右端維護出乙個rightmax。leftmax+分界點處的值+rightmax即為所求。
#include#includeusing namespace std;
typedef long long int ll;
int a[200005];
ll cal(int l,int r)
thissum=0;
for(int i=mid+1;i<=r;i++)
return max(max(cal(l,mid),cal(mid+1,r)),leftmax+a[mid]+rightmax);//求出cal(l,mid),cal(mid+1,r),leftmax+a[mid]+rightmax三者之間的最大值
}int main()
cout《根據題意我們可以得出以下結論:
1)第乙個數字為有效序列。
2)如果乙個數加上上乙個有效序列得到的結果比這個數大(即前面的子列和》0),那麼該數也屬於這個有效序列。
3)如果乙個數加上上乙個有效序列得到的結果比這個數小(即前面的子列和<0),那麼這個數單獨成為乙個新的有效序列,我們需要將前面的子列和拋棄,即重新歸0。
綜上,我們可以得出以下**:
#include#include#includeusing namespace std;
typedef long long int ll;
int main()
cout
}
最大子列和
int maxsubsequencesum const int a,int n if thissum maxsum 如果新的子列和更大,則更新子列和 maxsum thissum return maxsum 時間複雜度o n3 int maxsubsequencesum const int a,in...
最大子列和
最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。注 為方便起見,如果所有整數均為負數,則最大子串行和為0。解決這樣乙個問題是乙個很有趣的過程,我們可以...
最大子列和問題
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...