这题就是个DP么 一直加 加到和为负数的时候就再从零开始加 中间吧最大值保存下来就OK了啊
呃,理论我已经不想探讨了,只想看一眼AC代码,明白自己死在哪儿就好。
2012-08-20 20:06
2012-08-20 20:25
程序代码:#include<stdio.h>
int main()
{
int i,t,n,a[100001],num=0,dp[100001],max,end,begin,q;
scanf("%d",&t);
while(t--)
{
num++;
for(i=0;i<100001;i++) dp[i]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
max=-99999;begin=1;end=1;q=0;
for(i=1;i<=n;i++)
{
dp[i]+=dp[i-1]+a[i];
q++;
if(dp[i]>max)
{
max=dp[i];
end=i;
begin=i-q+1;
}
if(dp[i]<0)
{
dp[i]=0;
q=0;
}
}
printf("Case %d:\n",num);
printf("%d %d %d\n",max,begin,end);
if(t>0) printf("\n");
}
return 0;
}
2012-08-20 21:02

2012-08-20 21:50
程序代码:
#include<stdio.h>
int main()
{
int M, N, i=0, j, s, a[20][3], tmp, t;
scanf("%d",&M);
for (; i<M; i++)
{
scanf("%d",&N);
scanf("%d",&s);
a[i][0]=s, tmp = 0, a[i][1] = 0, a[i][2] = 0;
for (j=1; j<N; j++)
{
scanf("%d",&t);
s>0?s+=t:(s=t, tmp=j);
s>a[i][0]?(a[i][0]=s, a[i][1]=tmp, a[i][2]=j):1;
}
}
for (i=0; i<M; i++)
{
printf("Case %d:\n",i+1);
printf("%d %d %d\n",a[i][0],a[i][1]+1, a[i][2]+1);
i!=M-1?printf("\n"):1;
}
return 0;
}
2012-08-25 00:26
程序代码:#include<stdio.h>
int main()
{
int length,temp,i,n,m;
int max,now,x;
int begin,end;
scanf("%d",&n);
for(m=1;m<=n;m++)
{
scanf("%d%d",&length,&temp);
now = max = temp;
begin = end = x = 1;
for(i=2;i<=length;i++)
{
scanf("%d",&temp);
if(now + temp < temp)
now = temp,x=i;
else
now += temp;
if(now > max)
{
max=now;begin=x;end=i;
}
}
printf("Case %d:\n",m);
printf("%d %d %d\n",max,begin,end);
if(m!=n) printf("\n");
}
}
//AC代码弱弱飘过
2012-08-26 11:59