最大连续子序列和问题

Max Sum

  • 思路:

    1. 如果全为负值,那么取最大值
    2. 如果有非负值,那么我们依次计算到当前位置为止的最大值。假设有n个元素,那么最大连续子序列只可能以0~n-1中某个位置结尾。当我们遍历到第i个元素时,判断以位置i-1为结尾的最大元素子序列和是否小于0,如果小于0,那么以位置i为结尾的最大连续子序列和为位置i对应的元素;否则,以位置i为结尾的最大连续子序列和为(以位置i-1为结尾的最大元素子序列和 + 位置i的元素)
  • 注意:
    输出的最后一行只有一个回车,否则可能会出现Presentation Error (PE)

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

int main()
{
    int T, N;
    cin >> T;

    for (int t = 0; t < T; t++)
    {
        cin >> N;
        vector<int> a;
        int max_here = 0, max_sum = 0, here_begin_pos = 0, here_end_pos = 0, begin_pos = 0, end_pos = 0;

        //read N integers
        for (int i = 0; i < N; i++)
        {
            int temp;
            cin >> temp;
            a.push_back(temp);
        }

        cout << "Case " << (t + 1) << ":" << endl;
        if (*max_element(a.begin(), a.end()) < 0)
        {
            max_sum = *max_element(a.begin(), a.end());
            begin_pos = (end_pos = find(a.begin(), a.end(), max_sum) - a.begin());
            cout << max_sum << " " << (begin_pos + 1) << " " << (end_pos + 1) << endl;
        }
        else
        {
            max_sum = (max_here = a[0]);
            for (int i = 1; i < N; i++)
            {
                if (max_here < 0)
                {
                    max_here = a[i];
                    here_begin_pos=(here_end_pos = i);
                }
                else
                {
                    max_here += a[i];
                    here_end_pos = i;
                }
                if (max_here > max_sum)
                {
                    max_sum = max_here;
                    begin_pos = here_begin_pos;
                    end_pos = here_end_pos;
                }
            }
            cout << max_sum << " " << (begin_pos + 1) << " " << (end_pos + 1) << endl;
        }
        if (t != T - 1)
        {
            cout << endl;
        }
    }
    return 0;
}

你可能感兴趣的:(最大连续子序列和问题)