Problem P03. [算法课分治] 找到最大子序和

C++实现最大子序列和:针对正负数序列的算法教程
本文介绍了使用C++编写的算法,解决如何在给定正负数序列中找到最大子序列和的问题,特别强调了处理全为负数的情况。

这将会是一个系统性的算法学习专栏,编程语言为C++,适用于刚开始学算法的学生和博友,建议需要的朋友收藏订阅,是免费的,希望对大家能够有所帮助。

在这里插入图片描述

求最大子序列和:

  1. 如果前面的序列为正数,后面紧接着出现一个最大子序列,那这个最大子序列加上一个相邻的正数数列才会是最大子序列。
  2. 要注意如果全为负数,那么最小的那个负数就是最大的子序列和
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

int n;

int main()
{
    scanf("%d", &n);
    long long valmax = 0;
    long long val = 0;
    int valmin = 0;
    while(n--)
    {
        int x;
        scanf("%d", &x);
        val += x;
        if (valmax < val)
        {
            valmax = val;
        }
        else if (val < 0)
        {
            if (valmin == 0)
            {
                valmin = val;
            }
            else if (valmin < val)
            {
                valmin = val;
            }
            val = 0;
        }
    }
    if (valmax == 0)
    {
        printf("%d", valmin);
    }
    else
    {
        printf("%lld", valmax);
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值