HDU 1003 Max Sum

来源:互联网 发布:mac设置iphone铃声2017 编辑:程序博客网 时间:2024/05/01 06:25

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003

题目大意:给出一段整型序列,求出序列中和最大的连续子序列,输出连续子序列的和,以及起始位置和末位置。

例如:给出  6 -1  5 4 -7   

             sum最大的序列为  6 -1  5 4  则输出14,起始位置1和末位置3

思路分析:

下面为别人题解,稍作改动。

以下是变量说明:t        测试数据组数n        每组数据的长度temp        当前取的数据x  最后MAX SUM的起始位置y        最后MAX SUM的结束位置max当前得到的MAX SUMnow在读入数据时,能够达到的最大和flag记录最大和的起始位置,因为不知道跟之前的max值的大小比,所以先存起来下面模拟过程:1.首先,读取第一个数据,令now和max等于第一个数据,初始化pos1,pos2,x位置2.然后,读入第二个数据,判断①. 若是now+temp<temp,表示当前读入的数据比之前存储的加上当前的还大,说明可以在当前另外开始记录,更新now=temp②. 反之,则表示之前的数据和在增大,更新now=now+temp3.之后,把now跟max做比较,更新或者不更新max的值,记录起始、末了位置4.循环2~3步骤,直至读取数据完毕。

#include <stdio.h>int main(){    int t,n,i,j,tmp;    scanf("%d",&t);    for(i=1;i<=t;++i)    {        scanf("%d",&n);        int x,y,now,max,flag;        scanf("%d",&tmp);        now=max=tmp;//将now max  的值初始化为第一个值        x=y=flag=1;        for(j=2;j<=n;++j)        {            scanf("%d",&tmp);            if(tmp+now<tmp)//如果now+tmp小于tmp,说明now的值是小于0的,则把now的值赋值为tmp,并记录当前位置为当前序列的起始位置            {                now=tmp;                flag=j;            }            else            {                now+=tmp;//当now不小于0,则把tmp的值加入            }            if(max<now)//这个地方是个重点,如果max<now,就会记录在当前末位置的情况下,起始位置后的序列总和为最大的。如果不能满足,则,x,y 的值也不会改变            {                max=now;                x=flag;                y=j;            }        }        printf("Case %d:\n",i);        printf("%d %d %d\n",max,x,y);        if(i!=t)            printf("\n");    }}

                              

0 0
原创粉丝点击