之前写过一个最大子序列的积的问题,大概就是设置断点法,依次暴力遍历,但这个方法会在这里行不通,会输出超限。于是有了以下的小方法:
#include<stdio.h>
int a[1000000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)//输入多组数据,可以多次求出不同数列的最大子数的和
{
int i;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);//输入这组数列
int thissum=0,thisstar=0,thisend=0;//定义六个量
int maxsum=0,maxstar=-1,maxend=-1;
for(i=0;i<n;i++)
{
thissum+=a[i];//目前运行值是不是值得放在max中还需要判断
thisend=i;
if(thissum>maxsum)//开始判断
{
maxsum=thissum;//将目前运行值存入max中,但是可以保证起始点先不变,再重新进入
//循环时可以改变终止点
maxstar=thisstar;
maxend=thisend;
} //目前运行值若小于maxsum则起始终止点都不变,输出起始终止点
//的值依然正确
if(thissum<0)
{
thissum=0;
thisstar=i+1;//和小于0了说明之前的累加前功尽弃,开始设立新的起始点和终止点
thisend=i+1;//但妙就妙在我没有动max的值,即使后面越来越小也不会影响我。
}
}
printf("%d %d %d\n",maxsum,maxstar,maxend);//打印
}
return 0;
}
好使的方法,只要我有累加小于零的就不要之前的值了从新开始累加,原来的最大值不会受影响直到有新的最大值出现。