最大子序列和:整數序列A1, A2,... An (可能有負數),求A1~An的一個子序列Ai~Aj,使得Ai到Aj的和最大。
例如:
序列:-2, 11, -4, 13, -5, 2, -5, -3, 12, -9,則最大子序列和爲21。
序列:0, -3, 6, 8, -20, 21, 8, -9, 10, -1, 3, 6, 5,則最大子序列和爲43。
算法思路爲:求最大子序列和時,序列的起點不能爲負數。因爲當a[i]爲負數時,那麼總有爲正數的a[i+1]在它的前面做起點更加合適。所以當和爲負數時我們將其賦值爲0,將它拋棄掉(此時和也可以認爲是序列中的一個數,但它是負數,不適合做起點。我們將其拋棄)從下一個正數開始計算。全負數是一種特殊情況 ,此時我們選擇求絕對值最小的那一個。
代碼如下:
#include<iostream>
#include<vector>
using namespace std;
int maxsum(int a[],int n)
{
int sum=0;
int maxsum=-10000;
for(int i=0;i<n;i++)
{
sum+=a[i];
if(sum>maxsum) maxsum=sum;
else if(sum<0) sum=0;
}
return maxsum;
}
int main()
{
int a[100];
int n=0;
while(cin>>a[n])
{
n++;
}
cout<<maxsum(a,n);
return 0;
}