最大连续子序列的和
模板题链接Max Sum .
模板代码:
#include <iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#define me(a,b) memset(a,b,sizeof(a))
const int maxn=5e5+10;
using namespace std;
int a[maxn],x,y[maxn];
int dp[maxn];
int main()
{
int n;
scanf("%d",&n);
int w=n;
int t=1;
while(n--)
{
int m;
me(dp,0);//初始化,很重要!!!
me(y,0);
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
dp[0]=a[0];//后面代码有一个dp[i-1],i=1时,i-1=0,要先对dp[0]赋初值
y[0]=0;
for(int i=1;i<m;i++)
{
x=a[i];
y[i]=dp[i-1]+a[i];
dp[i]=max(a[i],dp[i-1]+a[i]);
//最大连续子序列的和的核心代码,表示在i点之前(包括i点)能得到的和最大的值
if(dp[i]==x&&dp[i]!=dp[i-1]+a[i])
y[i]=i;
else if(dp[i]==dp[i-1]+a[i])
y[i]=y[i-1];
//由于此题要找序列的起始位置和结束位置,所以我在找最大值的同时不断更新它的起始位置,
//如果dp[i]==dp[i-1]+a[i],说明起点没有变;反之,起点改变,更新起点
}
int maxx=dp[0];//遍历所有点,找到最大值
int k=0;
for(int i=0;i<m;i++)
{
if(maxx<dp[i])
{
maxx=dp[i];
k=i;//最大值所在的那一位就是终点位置
}
}
printf("Case %d:\n",t++);
printf("%d %d %d\n",dp[k],y[k]+1,k+1);
if(t<=w)
printf("\n");
}
return 0;
}