zoukankan      html  css  js  c++  java
  • hdu1231(最大连续子序列)

    最大连续子序列

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 16819    Accepted Submission(s): 7387


    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
    状态:f[i]:以i为结尾最长连续序列
    状态转移:f[i]=max{f[i-1]+a[i],a[i]}
    初始状态:f[1]=a[i]
    要求最大的,只需从f[]找出最大值就行了
     

    #include<iostream>
    using namespace std;

    int main()
    {
        int n,i,s[10001],a[10001],f[10001],max,st,end;  //f[i]为以i为结尾最长连续序列,s[i]为其开始点
        bool flag;
        while(cin>>n&&n)
        {
            flag=0;
            for(i=1; i<=n; i++)
            {
                cin>>a[i];
                if(a[i]>=0)
                    flag=1;
            }
            if(flag==0)
            {
                cout<<"0 "<<a[1]<<" "<<a[n]<<endl;
                continue;
            }
            f[1]=a[1];
            s[1]=1;
            for(i=2; i<=n; i++)
            {
                if(f[i-1]+a[i]>=a[i])
                {
                    f[i]=f[i-1]+a[i];
                    s[i]=s[i-1];
                }
                else
                {
                    f[i]=a[i];
                    s[i]=i;
                }
            }
            max=f[1];
            st=1;
            end=1;
            for(i=2; i<=n; i++)
            {
                if(f[i]>max)
                {
                    max=f[i];
                    st=s[i];
                    end=i;
                }
            }
            cout<<max<<" "<<a[st]<<" "<<a[end]<<endl;

        }
        return 0;
    }

  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/lxm940130740/p/3560469.html
Copyright © 2011-2022 走看看