1. 程式人生 > >01-1. 最大子列和問題(20)

01-1. 最大子列和問題(20)

給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2 },其連續子列{ 11, -4, 13 }有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

輸入格式:

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

輸出格式:

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

輸入樣例:
6
-2 11 -4 13 -5 -2
輸出樣例:
20
演算法一 
#include <iostream>
#define SIZE 100000
using namespace std;
int main()
{	int i,j,k,N,A[SIZE];
	int ThisSum=0,MaxSum=0;
	cin>>N;
	for(i=0;i<N;i++)
	{	cin>>A[i];
	}
	for(i=0;i<N;i++){/* i是子列左端位置*/
		for(j=i;j<N;j++){/* j是子列右端位置*/
			ThisSum=0;/* ThisSum是從A[i]到A[j]的子列和*/
		for(k=i;k<=j;k++)
			ThisSum+=A[k];
		if(ThisSum>MaxSum)/*如果剛得到的這個子列和更大*/
			MaxSum=ThisSum;/*則更新結果*/
		}
	}
	cout<<MaxSum<<endl;
	return 0;
}
演算法二
#include <iostream>
#define SIZE 100000
using namespace std;
int main()
{	int i,j,k,N,A[SIZE];
	int ThisSum=0,MaxSum=0;
	cin>>N;
	for(i=0;i<N;i++)
	{	cin>>A[i];
	}
	for(i=0;i<N;i++)
	{	ThisSum=0;
		for(j=i;j<N;j++)
		{  ThisSum+=A[j];/*對於相同的i,不同的j,只要在j-1次迴圈的基礎上累加1項即可*/
			if(ThisSum>MaxSum)
				MaxSum=ThisSum;
		}
	}
	cout<<MaxSum<<endl;
	return 0;
}

演算法三線上處理
#include <iostream>
#define SIZE 100000
using namespace std;
int main()
{	int K,i,n;
	int ThisSum=0,MaxSum=0,A[SIZE];
	cin>>K;
	for(i=0;i<K;i++)
	{	cin>>A[i];
	}

	for(i=0;i<K;i++)
	{	ThisSum+=A[i];/*向右累加*/
		if(ThisSum>MaxSum)/*發現更大和則更新當前結果*/
			MaxSum=ThisSum;
		else if(ThisSum<0)/*如果當前子列和為負*/
			ThisSum=0;/*則不可能使後面的部分和增大,拋棄之*/
	}
	cout<<MaxSum<<endl;
	return 0;
}