题108.pat甲级练习-1007 Maximum Subsequence Sum (25 分)


题108.pat甲级练习-1007 Maximum Subsequence Sum (25 分)


一、题目

在这里插入图片描述

二、题解

求最大子列和的问题,我们采用在线处理来解决,用一个for循环去从头到尾遍历数组,设一个当前和以及一个最大和,每次都把一个数组的元素加到当前和中,然后去和最大和比较,若更大,则更新,若当前和为负数,则此后再加一个正数也不会比只要那一个正数大,所以直接舍去它,将当前和置为0重新开始。最后我们可以得到最大子列和结果。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int N;
    cin>>N;
    vector<int> data(N);
    int flag_nagative=1;
    for(int i=0;i<N;i++)
    {
        cin>>data[i];
        if(data[i]>=0)
        {
            flag_nagative=0;
        }
    }
    int thissum=0,maxsum=0;
    vector<int> thispath,maxpath;
    maxpath.push_back(0);//开局先放个0到maxpath,从而解决最大子列和为0的情况
    for(int i=0;i<N;i++)
    {
        thissum+=data[i];
        thispath.push_back(data[i]);
        if(thissum>maxsum)
        {
            maxsum=thissum;
            maxpath=thispath;
        }
        else if(thissum<0)
        {
            thissum=0;//如果加上当前得元素以后当前子列和变负数则舍去,
                      //因为如果之后有个正数出现使它变大得话也不可能比单独那个正数更大
            thispath.clear();
        }
    }
    if(flag_nagative==1)//全负数时单独处理
    {
        cout<<maxsum<<" "<<data[0]<<" "<<data[N-1];
    }
    else
    {
        cout<<maxsum<<" "<<maxpath[0]<<" "<<maxpath[maxpath.size()-1];
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值