编程练习场————最大序列和

最大序列和

给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。对于S的所有非空连续子序列T,求和最大的子序列。

以上说明中:N 为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。

【输入说明】

在程序当前路径下存在文件input.data,程序从input.data中读取输入数据。

input.data为单行文本文件,存放着N个整数,数字之间用空格隔开。

【输出说明]

输出和最大的子序列,数字间以空格隔开。

【示例】

输入数据:1 -2 3 4 -10 6

输出数据:3 4

1.存储在a数组里面

2.和小于0就从头开始,记录好开始curstart  rnd一直都在记录

注意for中i++是在执行完之后

所以sum《0时,下一个i就是start(也是当前的i)

void maxsub1(int a[], int n,int &start,int &end)
{
	int sum = 0, maxsum = -999;
	int curstart = start = 0;
	for (int i = 0; i < n; ++i) {
		if (sum < 0) {
			sum = a[i];
			curstart = i;
		}
		else {
			sum += a[i];
		}
		if (sum > maxsum) {
			maxsum = sum;
			start = curstart;
			end = i;  //1,-2,3,4,-10,6,a[3]加上去之后最大end = 3,a[1]加上去小于0,start = 1
		}             //0,1 ,2,3,4  ,5

	}
}
#include <stdio.h>
#include <stdlib.h>
void maxsub1(int a[], int n, int &start, int &end);
int main()
{
	FILE *fin;
	char filename[] = "input.data";
	fin = fopen(filename, "r+");
	if (fin== NULL)
		printf("打开失败");
	int a[100] = { 0 }, i = 0;
	char ch = fgetc(fin);
	fseek(fin, 0, 0);
	while (ch != EOF)
	{
		fscanf(fin, "%d", &a[i]);
		i++;
		ch = fgetc(fin);
	}
	int k = i;
	int start  = 0;
	int end = 0;
	
	maxsub1(a, k,start,end);
	printf("%d",a[start]);
	for(i=start+1;i<=end;i++)
	   {printf(" %d",a[i]);}
	return 0;
}
void maxsub1(int a[], int n,int &start,int &end)
{
	int sum = 0, maxsum = -999;
	int curstart = start = 0;
	for (int i = 0; i < n; ++i) {
		if (sum < 0) {
			sum = a[i];
			curstart = i;
		}
		else {
			sum += a[i];
		}
		if (sum > maxsum) {
			maxsum = sum;
			start = curstart;
			end = i;  //1,-2,3,4,-10,6,a[3]加上去之后最大end = 3,a[1]加上去小于0,start = 1
		}             //0,1 ,2,3,4  ,5

	}
}

猜你喜欢

转载自blog.csdn.net/Whiteleaf3er/article/details/81780908
今日推荐