题意:求最大的片段和,并保存片段和的起点pre和终点end。
就是一个简单的DP:
dp[i-1]>=0 , dp[i] = dp[i-1]+a[i];最大片段和的起点不用改变。
dp<0,dp[i] = a[i];最大片段和的起点也要改变。
代码如下:
#include<stdio.h>
#define M 100005
int a[M],dp[M],pre[M];
int main()
{
int t,n,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&n);
dp[0] = -1010;
int max = -1010; //初始化
int s = 1,end = 1;
for(j=1;j<=n;j++)
{
dp[j] = 0;
scanf("%d",&a[j]);
if(dp[j-1] >= 0) //dp
{
dp[j] = dp[j-1]+a[j];
}
else
{
dp[j] = a[j];
s = j; //改变起点。
}
pre[j] = s;
if(dp[j] > max)
{
max = dp[j];
end = j; //找到终点。
}
}
printf("Case %d:\n",i);
printf("%d %d %d\n",max,pre[end],end);
if(i<t)printf("\n");
}
return 0;
}
附上几组测试用例:
input:
4 0 0 2 0
6 2 7 -9 5 4 3
4 0 0 -1 0
7 -1 -2 -3 -2 -5 -1 -2
6 -1 -2 -3 1 2 3
5 -3 -2 -1 -2 -3
output:
2 1 3
12 1 6
0 1 1
-1 1 1
6 4 6
-1 3 3
20 2 6
6 -1 2 3 4 5 6