Description
给出一序列,输出该序列的最大连续子段和以及该子段的起始点和终止点
Input
第一行为用例组数T,每组用例占一行,首先输入序列长度n,之后n个整数表示该序列
Output
输出给出序列的最大连续子段和以及子段的端点
Sample Input
2
5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
Sample Output
Case 1:
14 1 4
Case 2:
7 1 6
Solution
求最大连续子段和,经典dp,用sum累加每项的值,每次累加后更新最大值,如果sum<0则令sum=0,注意记录左右端点的值以及特判序列全为负的情况
Code
#include<stdio.h>
int dp[100500],n;
int main()
{
dp[0]=0;//初始化
int test,k;
scanf("%d",&test);
for(k=1;k<=test;k++)
{
scanf("%d",&n);
int flag=1,i,j;
for(i=1;i<=n;++i)
{
scanf("%d",&dp[i]);
if(dp[i]>0)
flag=0;
}
int ans=-1000000000,st,ed;
if(flag)//全为负则特判选出最大值
{
for(i=1;i<=n;i++)
if(ans<dp[i])
{
ans=dp[i];
st=ed=i;
}
}
else
{
int sum=0;st=ed=1;//初始化
for(int i=1,j=1;i<=n;i++)
{
sum+=dp[i];
if(sum>ans)//更新最大值和起点终点
{
st=j;
ed=i;
ans=sum;
}
if(sum<0)
{
sum=0;
j=i+1;
}
}
}
printf("Case %d:\n",k);//按格式输出
printf("%d %d %d\n",ans,st,ed);
if(k<test)//最后一组输出后不用跟空行
printf("\n");
}
return 0;
}