1. 程式人生 > >51nod 1094 迴圈陣列最大子段和

51nod 1094 迴圈陣列最大子段和

解題思路:本問題跟之前和為k的連續區間解題演算法稍有不同:

1.該題連續區間的範圍是迴圈序列;

2.如果仍然使用上述演算法會超時。

解題方法:

對於迴圈序列,需要考慮兩種情況:

1.不考慮迴圈序列的情況下求出連續序列的最大值

2.若是最大值的產生情況是一部分取頭+一部分取尾。則只需求出中間部分連續序列和為負數的最小值

對於第2種情況,可以把問題轉化為求在對序列取反的情況下求中間部分和為正數的最大值。

最後比較1,2結果哪個大就選取哪個。

原始碼附上:

#include <iostream>
#include <algorithm>
using namespace std;
long long A[50001], temp[50001];
int N;

long long SumMax(long long B[])
{
	temp[1] = A[1];
	long long ans = 0;
	for (int i = 1; i <= N; i++)
	{
		temp[i] = max(temp[i - 1] + A[i], A[i]);
		ans = max(ans, temp[i]);
	}
	return ans;
}

int main()
{
	long long sum = 0,sum1,sum2,result;
	int i;
	cin >> N;
	for (i = 1; i <= N; i++)
	{
		cin >> A[i];
		sum += A[i];
	}
	sum1 = SumMax(A);
	for (i = 1; i <= N; i++)
	{
		A[i] = -A[i];
	}

	sum2 = SumMax(A);
	sum2 = sum + sum2;
	result = sum1>sum2 ? sum1 : sum2;
	cout << result << endl;
	return 0;
}