求子数组的最大和

简介: 分析:输入一个整形数组,数组里有正数也有负数,数组中一个或连续的多个正数,求所有子数组的和的最大值。 当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。

 

分析:输入一个整形数组,数组里有正数也有负数,数组中一个或连续的多个正数,求所有子数组的和的最大值。

当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。

因此需采用DP思想,记录下当前元素之和(为其最优状态,既最大),将其与目前所得的最大和比较,若大于则更新,否则继续。状态的累加遵循这个过程:如果当前和小于0,则放弃该状态,将其归零。

扩展:数对之差的最大值

 

 1 //求子数组的最大和
 2 //利用的是dp的思想,依次遍历数组中的每个元素,把他们相加,如果加起来小于0,则
 3 //把当前元素之和清为0,否则则和最大和比较,更新最大和,最后得到必是子数组的最大和
 4 #include<iostream>
 5 using namespace std;
 6 
 7 int findGreatestSubSum(const int a[],const int size)
 8 {
 9     int curSum=0;
10     int maxSum=0;
11 
12     for(int i=0;i<size;i++)
13     {
14         curSum+=a[i];
15         if(curSum<0) 
16             curSum=0;   //放弃这个阶段,从新开始
17         if(curSum>maxSum) 
18             maxSum=curSum; //更新最大和
19     }
20 
21     if(maxSum==0)
22     {            //若是数组中的元素均为负数,则输出里面的最大元素
23         maxSum=a[0];          //当然这步也可以写到上面一个循环里
24         for(int i=1;i<size;i++)
25         {
26             if(maxSum<a[i]) 
27                 maxSum=a[i];
28         }
29     }
30     return maxSum;
31 }
32 
33 int main(void)
34 {
35     int a[]={1, -2, 3, 10, -4, 7, 2, -5};
36     int length=sizeof(a)/sizeof(int);
37 
38     cout<<findGreatestSubSum(a,length)<<endl;
39     system("pause");
40     return 0;
41 }

 

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
2月前
|
测试技术
leetcode-152:乘积最大子数组
leetcode-152:乘积最大子数组
34 0
|
2月前
leetcode-560:和为 K 的子数组
leetcode-560:和为 K 的子数组
30 0
|
2月前
leetcode-1800:最大升序子数组和
leetcode-1800:最大升序子数组和
23 0
|
2月前
leetcode-2104:子数组范围和
leetcode-2104:子数组范围和
29 0
|
11月前
|
人工智能
LeetCode-2104 子数组范围和
LeetCode-2104 子数组范围和
|
11月前
|
存储 算法 Linux
【前缀和】560.和为 K 的子数组
暴力解法:我们很容易想到通过两个for循环去遍历数组中所有和的可能,之后来判断有几个满足K.他的代码十分的简单,所以这里直接给出.
35 0
|
11月前
力扣 713. 乘积小于 K 的子数组
力扣 713. 乘积小于 K 的子数组
47 0
|
11月前
|
存储 算法 Linux
【前缀和】974. 和可被 K 整除的子数组
同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.
37 0
和为K的子数组
和为K的子数组
49 0