• 最大子段和


    题目链接: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 }
  • 相关阅读:
    C# WinForm程序退出的方法
    SpringCloud 微服务框架
    idea 常用操作
    Maven 学习笔记
    SpringBoot 快速开发框架
    html 零散问题
    Java方法注释模板
    Seating Arrangement
    hibernate 离线查询(DetachedCriteria)
    hibernate qbc查询
  • 原文地址:https://www.cnblogs.com/huaszjh/p/4731263.html
Copyright © 2020-2023  润新知