【算法总结-DP】求子数组的最大和

这篇博客总结了使用动态规划(DP)解决求解数组中最大子数组和的问题,阐述了如何在O(n)的时间复杂度内找到解。文章详细介绍了算法思路,包括如何记录当前数组和与最大子数组的和,并在和为负数时重新开始。此外,还探讨了在二维矩阵中寻找最大子矩阵和的类似方法,通过画图分析问题并给出相应的算法实现。
摘要由CSDN通过智能技术生成

    快要毕业了,逐步把之前做过的一些算法和数据结构,项目相关资料总结整理一下,一来温习一下之前的知识,二来记录下学习点滴,方便之后的学习。

    题目描述:给定一个整数数组,数组中有正数也有负数,数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和,求给定数组的最大子数组和。也成为“最大子段和”问题。要求时间复杂度为O(n).

    该题目是一个简单的DP问题。算法的思路很多,但是如果要满足时间复杂度为O(n)。一般的算法是达不到的。

DP解决该问题的思路是:扫描数组,记录当前数组的和 与 已经记录的最大的子数组的和。如果当前记录的和已经是负数,那么舍弃它,并重新设置当前数组和为当前元素的值。否则,比较当前数组的和与已经记录的最大的子数组的和大小,如果比最大的和大,就更新最大和。扫描一遍完成统计,满足题目的要求。

算法实现如下:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

int maxSubSum(int *a,int n){
	assert(n > 0);
	int max = 0,curSum = 0;
	for(int i = 0;i < n;i++){
		if(curSum > 0){
			curSum += a[i];
		}
		else{
			curSum = a[i];
		}
		if(curSum > max){
			max = curSum;
		}
	}
	re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值