最大連続サブシーケンスの和の計算

2148 ワード

タイトルの説明


K個の整数のシーケンス{N 1,N 2,...,NK}が与えられ、その任意の連続サブシーケンスは{Ni,Ni+1,...,Nj}として表すことができ、そのうち1<=i<=j<=Kである.最大連続サブシーケンスは、すべての連続サブシーケンスの要素と最大の1つであり、例えば、所与のシーケンス{−2,11,−4,13,−5,−2}であり、その最大連続サブシーケンスは{11,−4,13}、最大および20である.サブシーケンスの最初の要素と最後の要素を出力する必要があるという要件が追加されました.

入力


テスト入力にはいくつかのテスト例が含まれており、各テスト例は2行を占め、1行目は正の整数K(K<10000)を与え、2行目はK個の整数を与え、中間はスペースで区切られている.Kが0の場合、入力は終了し、この例は処理されない.

しゅつりょく


各テスト例について、最大および最大連続サブシーケンスの最初の要素と最後の要素を1行に出力し、中間をスペースで区切ります.最大連続サブシーケンスが一意でない場合、出力シーケンス番号iおよびjが最小である(例えば、入力サンプルの2番目、3番目のグループ).すべてのK個の要素が負数である場合、最大と0を定義し、シーケンス全体の先頭と末尾の要素を出力します.

サンプル入力


6-2 11 -4 13 -5 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20

サンプル出力


20 11 1310 1 410 3 510 10 100 -1 -20 0 0
#include <stdio.h>
#include <stdlib.h>

int max(int a,int b)
{
	return a>b?a:b;
}

int get_max(int data[],int size,int * max_index,int * type)
{
	int sum[10000+10];
	int max_result;
	int flag;

	sum[0] = data[0];
	max_result = sum[0];
	*max_index = 0;
	flag = 1;

	if(data[0] >= 0)
		flag = 0;

	for(int i=1; i<size; i++)
	{
		if(data[i] >= 0 )
			flag = 0;

		sum[i] = max(data[i],sum[i-1]+data[i]);
		if(sum[i] > max_result )
		{
			max_result = sum[i];
			*max_index = i;
		}
	}

	if(flag == 1)
	{
		max_result = 0;
		*type = 1;
	}else
		*type = 2;
	
	return max_result;
}

int main()
{
	while(1)
	{
		int num;
		scanf("%d",&num);
		if(num == 0)
			break;

		int data[10000+10];
		for(int i=0; i<num; i++)
			scanf("%d",&data[i]);

		int index,type,max2,tmp;
		tmp = max2 = get_max(data,num,&index,&type);
		if(type == 1)
			printf("%d %d %d
",tmp,data[0],data[num-1]); else { int index_min=0; for(int i=index; i>=0; i--) if((max2-=data[i]) == 0) index_min = i; printf("%d %d %d
",tmp,data[index_min],data[index]); } } return 0; } /* ,b[i] i , b[i] = max(b[i-1]+a[i],a[i]); 1<=i<n b[i] 。 * /