zoukankan      html  css  js  c++  java
  • 最大子段和

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/A

    题意:

            多组案例,每组案例给出给出一组字符串,找出这组字符串中连续子串的和的最大值。

           输入:首行输入案例数,每个案例先输入字符串长度,再输入字符串。案例与案例间用空行间隔。

    案例:

            Sample Input     

            2

            5 6 -1 5 4 -7

            7 0 6 -1 1 -6 7 -5

            Sample Oouput

            Case 1:14 1 4

            Case 2:7 1 6

    分析:

           最大子序列即找出数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是{5,-3,4,2},它的和是8,达到最大;而{5,-6,4,2}的最大子序列是{4,2},它的最大和是6。只要前i项的和还没有小于0则子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时记下各个子序列的和,最后找到和最大的子序列。
    源代码:

     1 #include<cstdio>
     2 int a[100010];
     3 int main()
     4 {
     5     int T,cnt=0;
     6     scanf("%d",&T);
     7     while(T--)
     8     {
     9         int n,count=-1000,sum=0,l=1,r,k=1;
    10         scanf("%d",&n);
    11         for(int i=0;i<n;i++)
    12             scanf("%d",&a[i]);
    13         for(int j=0;j<n;j++)//找最大子串
    14         {
    15             sum+=a[j];
    16             if(sum>count)//当前子串延续,和继续增大
    17             {
    18                 count=sum;
    19                 l=k;//记录子串开始位置
    20                 r=j+1;//记录子串结束位置
    21             }
    22             if(sum<0)//当前子串和值达负值,另寻子串比较
    23             {
    24                 sum=0;
    25                 k=j+2;
    26             }
    27         }
    28         printf("Case %d:
    %d %d %d
    ",++cnt,count,l,r);
    29         if(T) printf("
    ");
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    RAM调优之日志分析
    HDU Always Cook Mushroom (极角排序+树状数组)
    并非全部的程序猿都适合做技术管理
    HTTP Header具体解释
    Linux 通配符
    寻找正在连接中的网络连接
    hdu 1052 田忌赛马
    linux上电自启动应用程序具体解释
    C++ 中的 const 类型变量
    FileUtil
  • 原文地址:https://www.cnblogs.com/huaszjh/p/4731263.html
Copyright © 2011-2022 走看看