连续子数组最大和

博客探讨了如何使用动态规划算法找到一个整数数组中连续子数组的最大和。通过自底向上的分析,当数组元素可能导致子数组总和变为负数时,选择划分新子数组以最大化总和。代码示例展示了如何实现这一算法,输入数组如[-1,-2,-3,-10,-4,-7,-2,-5],输出最大子数组和为18。
摘要由CSDN通过智能技术生成

连续子数组最大和

题目
	输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
	输入 :[1,-2,3,10,-4,7,2,-5]
	输入 :18
	思路: 该题的关键在于何时生成子数组
	自底向上分析:
		第一次得到数组[1], sum = 1, max = 1
		第二次得到数组[-2], 此时划分了子数组,如果-2加入上一个数组, 数组的和sum就为负数, 对其他的数组元素就没有了增
			强的作用,所以需要划分子数组。划分数组以后就需要判断前后两个数组和,谁最大。sum = -2,
		第三次得到数组[3], 此时也划分了子数组,如果3 加入上一个数组,虽然数组和不为负数,但是,上一个数组的和拖累了
			当前元素array[i] 即3,所以也需要划分子数组。sum = 3 大于max ,max更新=3。
		第四次得到数组[3, 10], sum = 13, max更新,max=13
		第五次得到数组[3, 10, -4], sum = 9.
		........
		最终得到数组[3, 10, -4, 7, 2, -5]; sum = 13, max = 18
#include<iostream>
using namespace std;

int FindGreatestSumOfSubArray(int* array, int arrayLen ) {
    int max = array[0],//当数组长度为1 
    arraySum = array[0];//当数组长度为1
    int i, j;
	for(i = 1; i < arrayLen; i ++){
		if(arraySum + array[i] >= 0 && arraySum >= 0){//要array[i] 
			arraySum += array[i];
			if(arraySum > max){
				max = arraySum;
			}
		}else{ 
			max = array[i] > max ? array[i] : max;//有两种情况 a 降低 b或者b降低a 
			arraySum = array[i];//继续向下寻找时,重新开始一个数组,所以新数组的起始 
		}
	} 
	return max;
}
int main(){
	int arry[] = {-1,-2,-3,-10,-4,-7,-2,-5}; 
	cout << FindGreatestSumOfSubArray(arry, 8);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值