ACM第三次练习—1001

题意:给出序列a [1], a [2], a [3] ...... a [n],计算子序列的最大总和。

思路:最大子序列是要找出由数组成的一维数组中和最大的连续子序列。方法是:只要前i项和还没有小于0子序列就一直往后扩展,否则丢弃之前的子序列开始新的子序列,同时记录各个子序列的和,最后取他们中的最大值。

感想:第一道动态规划题,感觉要考虑的东西很多,脑子有些不都用了~

代码:



 #include<stdio.h>


int main()


{


    int i,ca=1,t,s,e,n,x,now,before,max;


    scanf("%d",&t);


    while(t--)


    {


       scanf("%d",&n);


       for(i=1;i<=n;i++)


       {


         scanf("%d",&now);


         if(i==1)


         {


            max=before=now;


            x=s=e=1;


         }


         else {


             if(now>now+before)


             {


                before=now;


                x=i;


             }      


             else before+=now;


              }


         if(before>max)


           max=before,s=x,e=i;


       }


       printf("Case %d:\n%d %d %d\n",ca++,max,s,e);


       if(t)printf("\n");


    }


    return 0;


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章