数组最大的和是多少? 对应的N和M是多少?

本文探讨了寻找一组整数中最大连续子数组和的有效算法。通过三种不同方案对比,包括暴力求解、基于元素大小的优化及动态规划方法,旨在提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

有31, -41, 59, 26, 53, 58, 97, -93, -23, 84十个数。SUM(N,M)表示从第N个数到第M个数的和。如:SUM(2, 3) = -41 + 59 = 18。问:最大的和是多少? 对应的N和M是多少?

 

方案一:

计算所有的 SUM ,把 SUM_MAX 记录下来

 

 

方案二:

在 方案一 上改进,若前一个元素大于当前元素,则前一元素的SUM_MAX一定大于当前元素的SUM_MAX。

如 SUM(10, -2, 3) 一定大于 SUM(-2, 3)。

所以可有以下改进

 

方案三:

受上述方案启发,SUM_MAX(0,N-1) 的最大和是 A(1) + SUM_MAX(2,N-1)
可以得出
SUM_MAX(2,N-1) = A(1) + SUM_MAX(3,N-1)
SUM_MAX(3,N-1) = A(1) + SUM_MAX(4,N-1)
SUM_MAX(4,N-1) = A(1) + SUM_MAX(5,N-1)
.......
就是 SUM_MAX(i,N) = A(i) + SUM_MAX(i-1,N-1)
比如 SUM_MAX(7,9){-93, -23, 84} = -93 + SUM_MAX(8,9){-23, 84}

代码如下:

 

 

 

全部代码(copy到cpp上可以直接编译运行):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值