PAT 1007 Maximum Subsequence Sum

题目描述

英文

在这里插入图片描述

中文大意

给定 K 个整数序列,获取它的最大子序列之和
在一行内首先输出最大子序列之和,并输出子序列的头和尾
如果最大子序列不是唯一,输出最小的 i、j 的组合
如果全部 K 个整数 都是负数——你应该输出最大值为 0 i、j 为第一个和最后一个的索引

样例

在这里插入图片描述

思路分析

看子序列问题,首先想到滑动窗口,但是好像行不通
暴力法不考虑
思考动态规划
设定一个临时值temp 来存储目前的子序列和
设定一个标志变量flag 来判断,如果所有的seq中的数都是负数,则输出特情

code

#include <iostream>
using namespace std;

int main() {
    // seq长度
    int n;
    cin >> n;
    bool flag = true;
    // 此处sum定义为 -1 是处理最大值为0的特殊情况
    int temp = 0, sum = -1, left = 0, right = n - 1, tempIndex = 0, seq[n];
    for (int i = 0;i < n;i++) {
        cin >> seq[i];
        // 特情排查
        if (seq[i] >= 0) flag = false;
        temp += seq[i];
        // 小于0的子序列可以排除掉 移动left
        if (temp < 0) {
            // 移动左索引 i 更新temp的值
            temp = 0;
            tempIndex = i + 1;
        } else if (temp > sum) {
            // 更新最大值 和 索引
            sum = temp;
            left = tempIndex;
            right = i;
        }
    }
    if (flag) cout << 0 << " " << seq[0] << " " << seq[n-1];
    else cout << sum << " " << seq[left] << " " << seq[right];
//     if (flag) sum = 0;
//     cout << sum << " " << seq[left] << " " << seq[right];
    return 0;
}

需要注意的判定点

// 因为是整数 所以 sum 是负数里最小的 如果设为 0 在最大值为 0 时会出问题
int sum = -1;

bool flag = true;
// 如果 非负 则设置flag为false
// 网上看到大佬们可以不设置flag 不过个人感觉这样可读性会好一点
if (seq[i] >= 0) flag = false;

题目链接

1007 Maximum Subsequence Sum

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值