最大字段和问题(分治算法)

mac2024-10-26  16

问题:给定由n个整数(包含负整数)组成的序列a1,a2,…,an,求该序列子段和的最大值。 当所有整数均为负值时定义其最大子段和为0。 所求的最优值为: 分析: 从问题的解的结构可以看出,它适合于用分治策略求解: 如果将所给的序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种情形: a[1:n]的最大子段和与a[1:n/2]的最大子段和相同; a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同; a[1:n]的最大子段和为下面的形式。

#include<iostream> using namespace std; #define NUM 1001 int a[NUM]; int MaxSum(int n){ int sum=0; //最大子段和 int b=0; //1~j的最大子段和,因无需保留其他结果,所以没必要定义数组 for (int i=1;i<=n;i++) { if (b>0) b+=a[i]; else b=a[i]; if (b>sum) sum=b; } return sum; } int main(){ }
最新回复(0)