HDOJ 1003

来源:互联网 发布:八叉树算法 编辑:程序博客网 时间:2024/05/29 13:12

题目:求一串数字的和的最大值,并写出这个最大值的开始位置与结束位置。

 

题解:思路一、将所有数字录入后用穷举法求出所有字符串的值一一对比。但是该方法超时。

            思路二、每一个数依次对比,在计算本数前先判断之前的数列最大值是否大于零,

                            大于零的话加上当前数后与最大值比较看新的数列和是否为最大值,

                           小于零的话则从当前数开始求新的数列和!并且与之前的最大值比较后选择数列的开始位置及最值。

 

代码:

#include<stdio.h>int a[100010];int main(){ int t,n,r,s,i,max,st,en,m; while(scanf("%d",&t)!=EOF) {  for(r=1;r<=t;r++)  {   scanf("%d",&n);   for(i=1;i<=n;i++)    scanf("%d",&a[i]);   s=max=-99999;     //s表示当前的和max表示最大值先都初始化。   m=st=en=1;       //st为开始位置,en为结束位置,m为可能成为的开始位置。   for(i=1;i<=n;i++)   {    if(s<0)      //加当前数之前的数列和小于零的话,和"S"直接为当前数,可能的开始位置为当前位置。    {     s=a[i];     m=i;    }    else        //加当前数之前的数列和大于等于零的话,和"s"为"s"+当前数,    {     s+=a[i];    }    if(s>=max)  //当前数列和“s”大于最大值时,改变最大值,将目前位置定义为最终位置,开始位置为m    {     max=s;     en=i;     st=m;    }   }   printf("Case %d:\n%d %d %d\n",r,max,st,en);   if(r!=t)    printf("\n");  } } return 0;}
原创粉丝点击