最大序列和
给出一个整数序列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
}
}