求最大子序列的和O(n)算法複雜度

題目:輸入一組整數,求出這組數字子序列和中的最大值,只要求出最大子序列的和,不必求出最大值對應的序列。

最大子序列和:整數序列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;
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章