【PAT甲级 - C++题解】1007 Maximum Subsequence Sum

简介: 【PAT甲级 - C++题解】1007 Maximum Subsequence Sum

1007 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

题意

最大子序列是指序列内各元素之和最大的连续子序列。现在你需要求出最大子序列的各元素之和,并且输出最大子序列的第一个元素和最后一个元素的值。


思路

状态表示: f [ i ] f[i]f[i] 表示所有以 i ii 为右端点的区间中区间和的最大值。


状态计算: f [ i ] = m a x ( w i , f [ i − 1 ] + w i ) = w i + m a x ( f [ i − 1 ] , 0 ) f[i] = max(w_i,f[i-1]+w_i)=w_i+max(f[i-1],0)f[i]=max(w

i

,f[i−1]+w

i

)=w

i

+max(f[i−1],0)


我们在写代码的时候就可以用一个变量 f 来代替数组,表示当前区间和,然后用一个 res 来记录最大的区间和。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int w[N];
int n;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)    cin >> w[i];
    //从前往后遍历,动态更新答案
    int res = -1, l, r;
    for (int i = 0, f = -1, start; i < n; i++)
    {
        //如果f小于0,则抛弃当前区间,从i开启新的区间
        if (f < 0) f = 0, start = i;
        f += w[i];
        if (res < f)   //如果当前连续区间和大于res,则更新
        {
            res = f;
            l = w[start], r = w[i];
        }
    }
    if (res < 0)   res = 0, l = w[0], r = w[n - 1];
    cout << res << " " << l << " " << r << endl;
    return 0;
}
目录
相关文章
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
66 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
82 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
76 0
|
存储 C++ 容器
【PAT甲级 - C++题解】1057 Stack
【PAT甲级 - C++题解】1057 Stack
76 0
|
存储 C++
【PAT甲级 - C++题解】1055 The World‘s Richest
【PAT甲级 - C++题解】1055 The World‘s Richest
78 0
|
C++
【PAT甲级 - C++题解】1051 Pop Sequence
【PAT甲级 - C++题解】1051 Pop Sequence
79 0
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4