• hdu1231最大连续子序列


    Problem Description

    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后一个元素。

    Input

    测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

    Output

    对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。  

    Sample Input

    6
    -2 11 -4 13 -5 -2
    10
    -10 1 2 3 4 -5 -23 3 7 -21
    6
    5 -8 3 2 5 0
    1
    10
    3
    -1 -5 -2
    3
    -1 0 -2
    0

    Sample Output

    20 11 13
    10 1 4
    10 3 5
    10 10 10
    0 -1 -2
    0 0 0

    思路:求最大连续子串和是判断当前的last是否和前面的和相加比这个要加进来的还小,如果还小的话,设置当前元素为新的序列首元素,否则就加进来作为最长序列的元素。这个算法可以说是最为快速简洁的算法,其时间复杂度为O(n)。注意:这道题里的maxsum如果是小于0的话,输出的首元素、尾元素应该是整个序列的首元素、尾元素,同时置maxsum为0输出。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int k,last,nowsum,maxsum,first,maxfirst,nowbegin,maxend;//分别表示整个序列元素的个数,序列中的元素,当前连续子序列的和,最大连续子序列的和,
     6     while(cin>>k&&k){//整个序列的首元素,最大子序列的首元素,当前序列的首元素,最大连续序列的尾元素
     7         cin>>last;
     8         maxfirst=first=nowbegin=maxend=nowsum=maxsum=last;//保证输入一个数时有输出
     9         while(--k){
    10             cin>>last;
    11             if(nowsum+last<last)nowbegin=nowsum=last;
    12             else nowsum+=last;
    13             if(nowsum>maxsum){//不用加等于,因为题目要求有相同和的时候输出序列号小的那个,即记录前面的即可
    14                 maxsum=nowsum;
    15                 maxfirst=nowbegin;//把当前最大连续序列的首元素赋给maxfirst
    16                 maxend=last;
    17             }
    18         }
    19         if(maxsum<0)cout<<"0 "<<first<<' '<<last<<endl;//若最大值小于0则输出'0' 首元素 尾元素即可
    20         else cout<<maxsum<<' '<<maxfirst<<' '<<maxend<<endl;
    21     }
    22     return 0;
    23 }
    作者:霜雪千年
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    https原理:证书传递、验证和数据加密、解密过程解析
    java web项目的https配置
    防止表单重复提交的八种简单有效的策略
    nginx.conf
    Java打war包or打jar包
    WarUtil
    MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)
    Spring使用注解实现AOP
    Spring添加声明式事务
    spring配置文件拆分策略及方法
  • 原文地址:https://www.cnblogs.com/acgoto/p/8465718.html
Copyright © 2020-2023  润新知