求子数组的最大和

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

 

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

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

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

相关文章
|
JavaScript
vue + element-ui + vue-clipboard2 实现文字复制粘贴功能与提示
1、在所在项目下安装插件 ```js npm install vue-clipboard2 --save ``` 2、在所在项目的index.js注入vue-clipboard2 ```js import VueClipboard from 'vue-clipboard2' Vue.use(VueClipboard) ``` 3、使用 ```html <div> <el-button size="mini" type="primary" icon="el-icon-copy-document" round class="copy-btn" v-clipboard:copy="要
304 2
【操作系统】实验八 proc文件系统
【操作系统】实验八 proc文件系统
259 1
|
算法 安全 数据处理
【C++ 编程范式】理解C++ 中编程范式,选择合适的方式
【C++ 编程范式】理解C++ 中编程范式,选择合适的方式
473 2
|
算法 异构计算
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
m基于FPGA的RS+卷积级联编译码实现,RS用IP核实现,卷积用verilog实现,包含testbench测试文件
142 0
|
区块链
量化合约交易系统开发|秒合约系统开发搭建源码
区块链还是一个透明可信的权利确认与追溯系统,一份权利一旦数字化为区块链上的通证
|
Python
蜂鸣器
无人机蜂鸣器是一种用于产生声音信号的装置,通常被安装在无人机的机身上。以下是无人机蜂鸣器的一些作用:
514 0
|
网络安全 云计算 数据中心
来自马来西亚的点赞!
来自马来西亚的点赞!
87 0
|
缓存 网络协议 网络架构
ARP与RARP
IPv4使用地址解析协议(ARP)详见下图。给出了ARP的工作机制。当一台设备需要发现另一台设备的数据1链路标识符时,它将建立一个ARP!请求数据包。这个数据包包括目标设备的IPv4地址以及请求设备(发送者)的源点IPv4地址和数据链路标识符(MAC地址)。然而ARP请求数据包被封装在数据帧中,其中带有作为源的发送者的MAC地址作为目标的广播地址。
287 0
ARP与RARP
|
7天前
|
人工智能 运维 安全