题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
以前做过类似的题目,但不需要保存下标。因为这题是动态规划的基础,所以从网上直接粘下来稍稍改动就保存下来了。步骤的含义都包含在代码中。。。
代码:
#include<stdio.h>
int main()
{
int s,n,i,j,num,begin,end,probable,sum,max,count=1;//**begin,end分别保存最大子串的首尾。sum保存连续字串(最大连续串[可能]在其中)。**//
//**max保存最大连续和,probalbe保存可能的最大连续和的首地址**//
scanf("%d",&s);
for(j=1;j<=s;j++)
{
sum=0;
probable=1;//**不是first=1,现在只是可能,到下面发现比目前大的连续子串时才用first记录**//
max=-100000;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&num);
sum=sum+num;
if(sum>max)//**发现比目前大的连续子串**//
{
max=sum;
begin=probable;
end=i;
}
if(sum<0)//**根据原理,后面可能有比他还大的**//
{
sum=0;//**重新记录**//
probable=i+1;//**可能更大的串一定从下一个开始**//
}
}
printf("Case %d:\n",count++);
printf("%d %d %d\n",max,begin,end);
if(j<=s-1)//**格式**//
{
printf("\n");
}
}
return 0;
}