给定由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。
在本文中,将介绍两种方法(蛮力法、动态规划法)并分别分析两种方法的时间效率。
蛮力法解决本问题非常简单粗暴,直接用循环嵌套,比较所有子段和的大小,最后输出最大子段和。
代码如下:
#include<iostream> using namespace std; int MaxSubsegmentSum1(int n,int array[]) {
int Max=0; for(int i=0;i<n;i++) //起始位置 {
for(int j=i;j<n;j++) //结束位置 {
int sum=0; for(int k=i;k<=j;k++) //求从i到j的子段和 {
sum=sum+array[k]; } if(sum>Max) {
Max=sum; } } } return Max; } int main() {
int n; cout<<"请输入该序列有多少个数字:"; cin>>n; int array[n]; cout<<"请依次输入数字:"<<endl; for(int i=0;i<n;i++) {
cin>>array