博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大连续子序列和的问题
阅读量:6287 次
发布时间:2019-06-22

本文共 1289 字,大约阅读时间需要 4 分钟。

问题描述 :
       数组 int  A[] = {-4 , 3 ,56 , -15 , 34 , 0 , -14 , 4} ; 某几个连续的子序列其和最大,比如A0+A1 = -1 。A1+A2+A3+A4 = 78 。则A1,A2,A3,A4组成的数组即是所求。

解决方案:

1.暴力求解O(n3)

  两层for循环,指定首尾指针,再来一层for循环来计算和,然后更新最大和就行。

2.动态规划O(n)

  动态规划的思想就是不断利用前面已经求得的结果,来计算当前的最优值。我们可以用sum[i]数组来表示,以A[i]为结尾的连续子数组的最大和。

  可以写出转态方程大概就是:sum[i]=max(sum[i-1]+A[i],A[i]).

代码:

 

int a[NUM]={-1,-1,9,9,9,-1 ,-1, 9 };    int sum=a[0];    int res=a[0];    for (int i=1;i
res) res=sum; } cout<
<

 

 

3.动态规划O(n)简化版

  设sum[i]表示为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是sum[i-1]加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + a[i], a[i])。

  可以通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。由于每次运算只需要前一次的结果,因此并不需要像普通的动态规划那样保留之前所有的计算结果,只需要保留上一次的即可,因此算法的时间和空间复杂度都很小。(sum[i-1]+a[i]>a[i]-->sum[i-1]+a[i]-a[i]>0-->sum[i-1]>0)。

伪代码:

result = a[1]sum = a[1]for i: 2 to LENGTH[a]  if sum > 0    sum += a[i]  else    sum = a[i]  if sum > result    result = sumreturn result

 

实现:

int MaxSum(int* a,int NUM){    int sum=a[0];    int res=a[0];    for (int i=1;i
0) sum+=a[i]; else sum=a[i];*/ sum=max(sum+a[i],a[i]) res=max(sum,res); } return res; }

 

 

转载于:https://www.cnblogs.com/fightformylife/p/4090061.html

你可能感兴趣的文章
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>