

之前写过一个最大子序列的积的问题,大概就是设置断点法,依次暴力遍历,但这个方法会在这里行不通,会输出超限。于是有了以下的小方法:
#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;
}
好使的方法,只要我有累加小于零的就不要之前的值了从新开始累加,原来的最大值不会受影响直到有新的最大值出现。
文章介绍了一种解决最大子序列和问题的优化方法,避免了暴力遍历导致的超时问题。通过在遍历过程中维护当前最大和以及起始索引,当和变为负数时重置,确保找到最大正和子序列。这种方法在遇到负数时能有效更新状态,且不丢失已有最大值。
522

被折叠的 条评论
为什么被折叠?



