原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
题意:给一行数,求 连续几个数的 最大和。
思路:动态规划, sum<0 sum= w [ a ], sum>=0 sum+= w[ a ]; 还有一点就是要标记 首位位置,模拟下过程你会发现,当 max 值 改变时 收尾位置 要发生改变,尾的位置很好确定就是 当前循环进行到的地方,那么首呢? 你会发现有时候 首 不改变,其实首的 位置与 sum<0 时的 i (看代码) 有关,需要中间一个数 j来传递,sum<0 是 更新 j ,当max 改变时 fir(首)= j 即可。。
AC代码:
#include<stdio.h>
int w[110000];
int main()
{
int a,i,j,n,ncase;
scanf("%d",&ncase);
for(i=1;i<=ncase;i++)
{
int sum=-1,max=-999999,fir=1,end=1;
j=1;
scanf("%d",&n);
for(a=1;a<=n;a++)
scanf("%d",&w[a]);
for(a=1;a<=n;a++)
{
if(sum<0)
{
j=a;
sum=w[a];
}
else
{
sum+=w[a];
}
if(sum>max)
{
max=sum;
fir=j;
end=a;
}
}
if(i-1)
printf("\n");
printf("Case %d:\n",i);
printf("%d %d %d\n",max,fir,end);
}
}