问题描述:
给定由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;
}

在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐