【题解】PATA1007 Maximum Subsequence Sum (25 分)⭐⭐⭐ 【连续子序列和】

105 阅读1分钟

PATA1007 Maximum Subsequence Sum (25 分)

题意:

求连续子序列和 给出N个数, 问最大的连续若干数的和是多少, 并输出左右边界元素的值 如果所有数都小于0,那么认为最大的和为0,并且输出首尾元素

题解:

比较简单的dp问题, 设置一个last值保存上一次可取的最左区间, tmp表示当前的和 遍历数组, 依次累加入tmp, 如果tmp<0, 则负数没有必要取, 直接舍弃之前的tmp, 令last = i+1 如果tmp > sum, 即更新答案即可

注意如果不把sum初始化为-1的话, 会有一组数据过不去(全是0)

经验小结:


#include<bits/stdc++.h>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int INF = 1 << 30;
const int MAXN = 1e4+10;

int n, a[MAXN];
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 0; i < n; ++i)
        cin >> a[i];
    int last = 0, l = 0, r = n-1, tmp = 0, sum = -1;
    for(int i = 0; i < n; ++i){
        tmp += a[i];
        if(tmp < 0){
            tmp = 0;
            last = i+1;
        }else if(tmp > sum){
            sum = tmp;
            l = last, r = i;
        }
    }
    if(sum < 0)
        sum = 0;
    cout << sum << ' ' << a[l] << ' ' << a[r] << endl;

    return 0;
}
//1 2 3 4 -5 5 -2 8 -21