【算法设计与分析】最大子段和问题

该博客探讨了最大子段和问题的解决方案,包括枚举法、分治法和动态规划法。枚举法提供了一个O(n^2)的算法,而分治法通过递归和合并操作达到O(n*logn)的时间复杂度。动态规划方法通过贪心策略,以O(n)的时间复杂度找到最大子段和。
摘要由CSDN通过智能技术生成

最大子段和问题的简洁描述是:对于给定序列[ x1,x2,x3...]寻找它的某个连续子段,使得其和最大。如{ -1,5,-2,1,-7,-4,2,3,-1,2 }最大子段是{ 2,3,-1,2 }其和为6。这个问题可以从枚举、分治、动态规划,贪心这几个角度来解。

(1)枚举解法思路:对于数组a[n],其连续的子段有

           以a[0]开始的 , { a[0] }, { a[0],a[1] },{ a[0],a[1],a[2] }.....共n    个

           以a[1]开始的,  { a[1] }, { a[1],a[2] },{ a[1],a[2],a[3] }.....共n-1个

           ...

           以a[n]开始的,{ a[n] }共1个

           一共(n+1)*n/2个连续子段,使用枚举,那么应该可以使用双重循环得到一个o( n^2 )级的算法:

int MaxSum_enum(int *arr,int n)
{
	int sum = 0;
	for(int i=0; i<n; ++i)
	{
		int thisSum = 0;
		for(int j=i; j<n; ++j)
		{
			thisSum += arr[j];
			if(thisSum > sum)
			{	sum = thisSum;}
		}
	}
	return sum;
}

当然在需要的时候,也可以设置一个区间记录值,记录这个子段的开始位置和结束位置:

int MaxSum_en
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值