【算法】最大子段和问题

卫衣 / 双肩包 / T 恤/羽绒服等任选,下单送 CSDN 年卡 程序员周边任选一款实物,直接赠送 CSDN 会员年卡+ Coding Plan,写代码学习装备一起拿下 立即抢购

        终于要开始学习算法了,想想都有点激动,理论的东西稍后再说,先来个例子看看

一、问题描述

        给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。

        输入:

                一个数组,由n个整数组成

        输出:

                这个数组的最大子段和

二、例子分析

        一个数组{3,-5,6,2},它的最大子段和为8。

分析:

        首先咱们只是单纯的分析下这个问题,数组中有4个元素,这个数组所有的子段和如下


        从图中可以看出,要想求出最大子段和,只要按照数组中元素的先后顺序,把所有相邻元素的相加情况列出来,通过比较相加的结果就可以得到最大子段和。思路如下:

第一步:计算所有关于第1个元素的加法

第二步:计算所有关于第2个元素的加法(排除第一步中用到的加法)

第三步:计算所有关于第3个元素的加法(排除第一、二步中用到的加法)

……

第五步:比较以上步骤中所有加法的结果大小,最大者即为所求

三、程序

        当数组中元素增多时,显然用手动的方式来计算就太费劲了,所以把上边解题的思路编成程序,让计算机来帮我们进行运算。

/// <summary>
/// 最大子段和问题:求最大值
/// </summary>
/// <param name="a">一个长度为n的二维数组</param>
/// <param name="n">二维数组的长度</param>
/// <returns></returns>

int Max(int[] a, int n)
{
    int max = 0;
    int temp = 0;

    //循环数组中所有的元素
    for (int i = 0; i < n; i++)
    {
        //包含第j个元素的所有相加情况,并去掉已经加过的情况
        for (int j = i; j < n; j++)
        {
            temp += temp + a[j];//把相加的结果,放到一个变量中

            //比较相加的结果是否比已有的最大值大
            if (max < temp)
            {
                max = temp; //替换最大值
            }
        }
    }

    return max; //返回最大值
}
      这个是求最大子段和的最基础思路,很简单,就是嵌套了两个for循环、一个if语句不太好。它还有很多种优化思路,亲们自行解决吧

C++解决最大问题 给定由n个整数(可能为负整数)组成的序列a[1],a[2],a[3],…,a[n],**最大问题**(sum of largest sub-segment problem)要该序列如a[i]+a[i+1]+…+a[j]的最大值,当所给的整数均为负数时定义为0,依此定义,所的最优值为:Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-20,11,-4,13,-5,-2)时,最大为20。 阅读详情

相关推荐

0013算法笔记——【动态规划】最大问题最大矩阵问题最大m问题

1、最大问题      问题定义:对于给定序列a1,a2,a3……an,寻找它的某个连续,使得其最大。如( -2,11,-4,13,-5,-2 )最大是{ 11,-4,13 }其为20。      (1)枚举法解      枚举法思路如下:      以a[0]开始: {a[0]}, {a[0],a[1]},{a[0],a[1],a[2]}……{a[0],a[1],

liufeng_king的专栏 3万+

MAX SUM 给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},该序列形如ai+ai+1,…,+aj的最大值。当所有的整数均为负数时定义其最大为0。

Description 给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},该序列形如ai+ai+1,…,+aj的最大值。当所有的整数均为负数时定义其最大为0。 Input 输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个整数,接下来一行有n个整数,它们之间用格隔开. Output 你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的最大. Sample Input 1 6 -2 11 -4 13 -5 -2 Sample Output 20

揭开最大问题的神秘面纱:从暴力法到极致优化的算法之旅

问题的核心是解一个数组中 **连续数组** 的最大。为了帮助大家更好地理解如何优化算法,我们将从最基础的暴力法出发,逐步介绍一些优化策略,最后给出最优解法。每一种算法都有其优点局限,适用于不同规模的数据。

平凡程序猿~的博客 2063

最大

问题描述:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],该序列如a[i]+a[i+1]+…+a[j]的最大值。

Comsmelo的博客 1067

算法设计与分析第二章作业

算法作业

ddhao09的博客 948

最大问题

题目 Problem Description 给定n(1<=n<=100000)整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],该序列如a[i]+a[i+1]+…+a[j]的最大值。当所给的整数均为负数时定义为0,依此定义,所的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如...

茶小⑦的学习日常 532

分治算法最大问题

分治算法最大问题 int MaxMin(int a[],int left,int right)函数功能是返回数组a的从left到right部分的最大,如果负数返回0,数组的每一元素整数; 写主函数main(),实现输入数组,调用MaxMin()函数,并输出结果功能;C或C++实现 (1)解题思路:这道题要我们用分治算法最大最大问题的分治策略是:将整一个序列分为长度相同的两序列,然后分成三种情况,第一种情况是max=max_left;第二种情况是max=max_righ

JobinXin的博客 5020

算法设计与分析】最大问题

说明:这是武汉理工大学计算机学院【算法设计与分析】课程的第二次实验第一题:最大问题 >>点击查看WUTer计算机专业实验汇总 谨记:纸上得来终觉浅,绝知此事要躬行。 一、实验题目: 给定由n个整数组成的序列(……)该序列形如的最大值,当所有整数均为负整数时,其最大为0。 二、实验要: (1)分别用蛮力法、分治法动态规划法设计最大问题的...

拾年之璐 6743

最大问题 分治算法

分治算法就是将一个问题分解成若干个小问题,对若干个小问题分别解,最后在合并起来 最大问题课以分成三种情况 1.数组a[1-n](数组前1至n个元素)最大a[1-n/2]的最大相同 2数组a[1-n](数组前1至n个元素)最大a[n/2+1-

qinjianganying的专栏 2297

最大问题算法设计分析实验报告

动态规划算法的时间复杂度为O(n),分治算法的时间复杂度为O(nlogn),而蛮力算法的时间复杂度为O(2n),因此随着问题规模的增加,最终的运行时间总会呈现:动态规划时间最短,分治算法的时间次之,蛮力算法的时间最长。通过对课程的理论学习与实践,我掌握了许多算法思想,思维创新能力实践能力得到了有效的提高,并且一题多解的情况让我对不同的算法有了更加深刻的认识。通过本次算法设计实验,我对蛮力法、分治法、动态规划法的理论知识有了更加深刻的理解,并通过设计算法实践增强了运用的熟练性。for(i = 0;

m0_52381146的博客 708

算法分析】——最大问题

算法设计专栏开启:传输门 欢迎各位star,当然还是将就习俗:先点赞在看,养成习惯~~~ 最大问题最大循环数组最大最小正最大矩阵资源传送门「❤️ 感谢大家」 最大 题面: 给定整数数组a[n],它的连续最大值,当所有整数均为负数为时为0。 分析: 设dp[i]表示以数字a[i]结尾的最大值,那么dp[i] = max(a[i], a[i]+dp[i-1])。 #include <bits/stdc++.h> using namespac

左手の明天的博客 742

算法设计--最大问题--分治法

算法设计--最大问题--分治法 给定由n个整数组成的序列(a1, a2, …, an)最大问题该序列形如的最大值(1≤i≤j≤n),当序列中所有整数均为负整数时,其最大为0。例如,序列(-20, 11, -4, 13, -5, -2)最大为:。 最大问题的分治策略是: (1)划分:按照平衡问题的原则,将序列(a1, a2, …, an)划分成...

qq_43238335的博客 4837

最大问题(这里给出三种算法

问题描述对于给定序列a1,a2,a3……an,寻找它的某个连续,使得其最大。如( -2,11,-4,13,-5,-2 )最大是{ 11,-4,13 }其为20。     (1)枚举法解     枚举法思路如下:     以a[0]开始: {a[0]}, {a[0],a[1]},{a[0],a[1],a[2]}……{a[0],a[1],……a[n]}共n个     以a[1]开始: {

qq_38010909的博客 1048

算法题:最大问题。给定由n个整数组成的序列,序列中最大,若所有整数均为负整数时定义最大为0。

前言 算法练习记录 题目 最大问题。给定由n个整数组成的序列,序列中最大,若所有整数均为负整数时定义最大为0。 例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大为: a2+a3+a4=20 输入格式: 第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。 输出格式: 输出第一行为最大,第二行为第一个数最后一个数在整个序列中的位序。 输入样例1: 6 -2 11 -4 13 -5 -2 输出样

Rightstar的博客 4302

最大问题算法的优化问题

问题的提出:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],该序列如a[i]+a[i+1]+…+a[j]的最大值。当所给的整均为负数时定义为0,依此定义,所的最优值为Max{0,a[i]+a[i+1]+…+a[j]},1 例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大为20显

海枫的专栏 7195

Kadane算法最大问题

但如果新开一个,但我们并不知道那最大,所以还要一个变量更新最大,设为q;q=max(2,-2)->选2;我先选第一本书,总价值为2,再看-4,加:2+(-4)=-2;不加:如果 当前元素。(之前的拖累整体),则w更新为-4;那么每本书就有加不加到的情况,那什么情况加呢?初涉算法,如有错误望指正;,但必须保持原数组的。

2403_88505816的博客 520

最大问题的动态规划算法

数组a长度位n 设b[m]为前m个元素最大,则b[m]=max{b[m-1]+a[m],a[m]} 即如果b[m-1]>0则b[m]=b[m-1]+a[m] 如果b[m-1]<=0则b[m]=a[m] #include<iostream> using namespace std; int main() { int MaxSum(int *a, int n); ...

qq_37444095的博客 939

算法】动态规划:最大问题

#include <iostream> #include <algorithm> using namespace std; //动态规划最大问题 int maxSubSumDP(int a[], int n){ int f[n+1]; f[0] = 0; int res = -0x3f3f3f3f; for (int i = 1; i <= n; i++){ if (f[i-1] >= 0){ ...

weixin_44566432的博客 1606
上一篇: 【Java笔记一】Filter过滤器
下一篇: 权限管理——RBAC应用
xjCherie
博客等级 码龄14年 405粉丝 129原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值