问题描述:
给定由n个整数(包含负整数)组成的序列a1,a2,…,an,求该序列子段和的最大值。当所有整数均为负值时定义其最大子段和为0。
所求的最优值为:
例如,当(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)时,最大子段和为:
算法分析:
计算最大子段和的动态规划算法
#define NUM 1001
int a[NUM];
int MaxSum(int n)
{
int sum=0;
int b=0;
for (int i=1;i<=n;i++)
{
if (b>0) b+=a[i]; else b=a[i];
if (b>sum) sum=b;
}
return sum;
}
计算最大子段和的动态规划算法的最优解
#define NUM 1001
int a[NUM];
int MaxSum(int n, int &besti, int &bestj)
{
int sum=0;
int b=0;
int begin = 0;
for (int i=1; i<=n; i++)
{
if (b>0) b+=a[i];
else {b=a[i]; begin = i;}
if (b>sum) //得到新的最优值时,更新最优解
{
sum = b;
besti = begin;
bestj = i;
}
}
return sum;
}