题目链接: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; }