给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果相关的知识,希望对你有一定的参考价值。

要详细的代码和一定的注释

#include <stdio.h>

int MaxSum(int *a,int n) 

int i,sum = 0,max = 0;

bool flag1 = false,flag2 = false;

for(i = 0;i < n;i++) 

if(a[i] > 0) flag1 = 1;

if(a[i] < 0) flag2 = 1;

if(flag1 && flag2)  // 序列中有正数,也有负数

for(i = 0;i < n;i++) 

if(a[i] < 0) 

if(max < sum) 

max = sum;

sum = 0;

else sum += a[i];

if(max < sum) max = sum;

else if(flag1 && !flag2)  // 全部为正

for(i = 0;i < n;i++) max += a[i];

else if(!flag1 && flag2) 

max = a[0];

for(i = 1;i < n;i++) 

if(a[i] > max) max = a[i];

else max = 0; // 全部为零

return max;

int main() 

int a[] = 31,-98,45,77,89,12,-92,88,80,120;

for(int i = 0;i < 10;i++) printf("%d ",a[i]);

printf("\\nMAX = %d\\n\\n",MaxSum(a,10));

return 0;

参考技术A 上面的解答明显不是满足连续和最大的解:如:int a[] = 31,-98,45,77,89,12,-92,88,80,120;是你自己给的例子,那么按照你的算法得出的Max=288;那么45,77,89,12,-92,88,80,120的和是多少呢?显然大于288.(注意这几个数的和45,77,89,12,-92大于零)。下面我给出本人的代码:
#include<stdio.h>
int main()
int max,sum,n,x;
while(scanf("%d",&n)!=EOF)
sum=0;
max=0;
while(n--)
scanf("%d",&x);
sum+=x;
if(sum>0)//sum大于0
if(sum>max)//sum大于max则sum赋值给max,否则继续加下一个数
max=sum;


else//sum<0,置sum为0
sum=0;


printf("%d\n",max);

return 0;

如3 2 -7 6 5 -10 3,求其中连续数字最大的和的过程如下:
设两个变量,sum和max。
sum 从前往后做相加运算,如果sum为正,则max和sum比较,取较大的放入max;如果sum小于max,则继续向后加;如果sum小于0,则sum清除为0。对于上述数组,
1.
sum = 3
max = 3

sum = 5
max = 5

sum = -2
max =5 sum = 0

sum = 6
max = 6

sum = 11
max = 11

sum = 1
max = 11

sum = 4
max = 11

则最大数是11

分治法 解决最大字段和问题

分治法求解最大字段和问题

1 问题描述

  给定由n个整数(可能由负数)组成的序列(a1, a2,...,an),最大字段和问题求 该序列中连续子段和的最大值,并找出这个连续子段。

2 使用python编程解决,具体代码如下

 

# 求出最大子段和, 以及最大子段和 对应的位置,返回的位置 可能时乱序,由于是连续的,找出最大值和最小值,即确定位置
def max_sum(row_data, left, right):
    sum_max_sub = 0
    position_list = []
    if left == right:
        if row_data[left] > 0:
            sum_max_sub = row_data[left]
            position_list.append(left)  # 记录下位置
        else:
            sum_max_sub = 0
    else:     # 三种情况
        center = (left + right) // 2
        left_sum, left_position = max_sum(row_data, left, center)     # 左侧 连续子段最大和
        right_sum, right_position = max_sum(row_data, center+1, right)  # 右侧 连续子段最大和

        # 第三种情况, 从中间向两侧 的连续子段最大和
        s1 = 0  # 用来记录 子段和
        lefts = 0
        for i in range(center, left-1, -1):
            lefts += row_data[i]
            if lefts > s1:
                s1 = lefts
                position_list.append(i)

        s2 = 0  # 用来记录 子段和
        rights = 0
        for j in range(center+1, right+1):
            rights += row_data[j]
            if rights > s2:
                s2 = rights    # 在这个 找位置吗??
                position_list.append(j)

        sum_max_sub = s1 + s2
        if sum_max_sub < left_sum:
            sum_max_sub = left_sum
            position_list = left_position
        if sum_max_sub < right_sum:
            sum_max_sub = right_sum
            position_list = right_position

    print("最大字段和为:{}".format(sum_max_sub))
    print("最大字段和对应的索引:{}".format(position_list))
    return sum_max_sub, position_list


def max_main():
    row_data = [-20, 11, -4, 13, -5, -2]
    max_sum(row_data, 0, len(row_data)-1)


max_main()

 

以上是关于给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果的主要内容,如果未能解决你的问题,请参考以下文章

详解 最大子段和

17-求连续数组和最大的序列

洛谷P1115 最大子段和

动态规划2最大子段和,编辑距离,括号匹配问题...

洛谷 P1115 最大子段和

分治法 解决最大字段和问题