Maximum Subsequence Sum(接上篇)

Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <= K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (<= 10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:
10
-10 1 2 3 4 -5 -23 3 7 -21
Sample Output:
10 1 4

总之和上面一篇几乎一样,有几点小坑注意一下就好了:

1:If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

2.The numbers must be separated by one space, but there must be no extra space at the end of a line.

3.最后一点没提到,也就是我一直不能AC的原因:

  当sequence中 全是非正数的情况,并不能归纳到 1 中,举个例子:sequence : -1 -2 -3  0 -5

                                out:0 0 0 而不是 0 -1 -5

code:

#include <iostream>
#include <vector>
using namespace std;

int SubSum(vector<int>& v,int& m,int& n,bool& find){
    int MaxSum = 0,tmp = 0,tmp_m = v[0];//先移动tmp_m
    m = n = v[0];//当sequence比当前大再把m移到tmp_m处
    for(int i=0;i<v.size();++i){
        tmp += v[i];
        if(tmp > MaxSum){
            find = true;
            int tmp_max = MaxSum;//tm_max用来判断是否移动n
            MaxSum = tmp;
            m =tmp_m;
            if(MaxSum > tmp_max)
                n = v[i];
        }
        else if(tmp < 0){
            tmp = 0;
            tmp_m = v[i+1];
        }
    }
    int max = v[0];
    for(int i=0;i<v.size();++i)
        if(v[i]>max){
            max =v[i];
            find = true;
        }
    if(max == 0)
        m = n =0;
    return MaxSum;
}

int main()
{
    int n,tmp,start,end;
    bool find =false;//是否存在最大子队列
    vector<int> v;
    cin >> n;
    for(int i=0;i<n;++i){
        cin >> tmp;
        v.push_back(tmp);
    }
    n = SubSum(v,start,end,find);
    if(find)
        cout << n << ‘ ‘ << start << ‘ ‘ << end << endl;
    else
        cout << n << ‘ ‘ << v.front() << ‘ ‘ << v.back() << endl;
    return 0;
}
   
时间: 2024-10-12 03:18:39

Maximum Subsequence Sum(接上篇)的相关文章

Maximum Subsequence Sum - 最大子列和问题_C语言实现

第一次写这方面的blog.自己也是初次接触相关知识,写的有不妥的地方十分欢迎大家指正~ 这是浙大PAT上的一道算法题(据说是浙大04年研究生复试题),题目是这样的: Maximum Subsequence Sum Given a sequence of KK integers { N_1N?1??, N_2N?2??, ..., N_KN?K?? }. A continuous subsequence is defined to be { N_iN?i??, N_{i+1}N?i+1??, ..

Maximum Subsequence Sum 最大子序列和的进击之路

本文解决最大子序列和问题,有两个题目组成,第二个题目比第一个要求多一些(其实就是要求输出子序列首尾元素). 01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N1??, N2??, ..., NK?? },"连续子列"被定义为{ N?i??, Ni+1 ..., Nj },其中 1≤i≤j≤K."最大子列和"则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4,

pat1007. Maximum Subsequence Sum (25)

1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <= K. The

Algorithm for Maximum Subsequence Sum z

MSS(Array[],N)//Where N is the number of elements in array { sum=0; //current sum max-sum=0;//Maximum Sum seq-start=0;//start of the subsequence seq-end=0;//end of the subsequence for(i=0;i<N;i++){ sum=sum+Array[i]; if(sum<0){ sum=0; seq-start++; }

1007. Maximum Subsequence Sum (25)——PAT (Advanced Level) Practise

题目信息: 1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <=

dynamic programming 之Maximum Sub-Sequence Sum(最大子序列和问题)

问题描述: 给定一个整数序列, 序列中可能有负数. 目的是找出这个序列的连续子序列(即子序列的元素的选取是连续的从序列中选取的).即通过确定i, j 的值,  使得的值达到最大. 我们定义, 当所有的元素为负数值的时候, 那么maximum subsequence sum 为0. 下面我们用动态规划的技术去求解. 为了找到最大连续子序列和,  不难看出, 在扩展我们的求和窗口的时候, 当新加进窗口的元素市负数的时候, 只要我们得到的新的求和窗口的值求和不是负数, 那么我们就不能丢掉这个新的负数.

1007 Maximum Subsequence Sum (25)(25 分)

1007 Maximum Subsequence Sum (25)(25 分) Given a sequence of K integers { N~1~, N~2~, ..., N~K~ }. A continuous subsequence is defined to be { N~i~, N~i+1~, ..., N~j~ } where 1 <= i <= j <= K. The Maximum Subsequence is the continuous subsequence

1007 Maximum Subsequence Sum(25 分)

1007 Maximum Subsequence Sum(25 分) Given a sequence of K integers { N?1??, N?2??, ..., N?K?? }. A continuous subsequence is defined to be { N?i??, N?i+1??, ..., N?j?? } where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has th

[PTA] PAT(A) 1007 Maximum Subsequence Sum (25 分)

目录 Problem Description Input Output Sample Sample Input Sample Output Solution Analysis Code Problem portal: 1007 Maximum Subsequence Sum (25 分) Description Given a sequence of $K$ integers { $N_{1}?$, $N_{2}?$, $...$, $N_{K}$ }. A continuous subsequ