最大序列和问题
来源:互联网 发布:詹姆斯身体素质知乎 编辑:程序博客网 时间:2024/06/05 07:45
问题描述:
给定整数(可以为负数),A1,A2,A3,....,AN,求子序列最大的值
举例:
对数组a[N] 例如下a[7]={4,-3,5,-2,-1,2,6,-2}其最大序列和为4+(-3)+5+(-2)+(-1)+2+6 = 11
之后即为书中提到的四种方法及解释
算法1
前两种算法的思路和程序都比较简单,一眼就能看懂。所以不做讲解
以上这个函数 1-4行是处理的基准情况,当left=right,那就只有一个元素,并且当该元素非负数
6-7行为两次递归,计算出前半部分和后半部分最大序列和,分别为7和8
8-12行及13-17行计算半边的最大和和到中间分界处的和。
#include "StdAfx.h" //#include "stdafx.h" int MaxSubs(const int A[], int N) { int ThisSum,MaxSum,j; ThisSum=MaxSum=0; for(j = 0;j<N;j++) { ThisSum += A[j]; if (ThisSum > MaxSum) { MaxSum = ThisSum; } else if (ThisSum < 0) { ThisSum = 0; }} return MaxSum; }
int _tmain(int argc, _TCHAR* argv[]) { int A[]={4,-3,5,-2,-1,2,6,-2}; int N= 8; int M = MaxSubs(A,N); for(int i=0;i<N;i++) printf("%d ",A[i]); printf("最大虚列数为:%d",M); return 0; }
如上既是算法四的思想写成的。
第四种算法的时间复杂度为O(N) 刚开始没看太懂,细看之后发现该算法效率最高且计算时间最短,第一种算法用了三个for循环,第二种算法两个for循环,相当于是把1-N所有可能计算了一遍,保留最大值
第三种比较巧妙,将一个数组分为前后两部分,分别计算两部分的最大数列,使用递归的思想。
且第四种算法还有一个优点是对数据只进行了一次读取。
阅读全文
0 0
- 最大序列和问题
- 最大序列和问题
- 最大和子序列问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题~~
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 记录一下最近接触到的新技能点,以后填充
- 【leetcode】第30题 Substring with Concatenation of All Words
- 洛谷P2730 魔板 Magic Squares
- 数据库信息配置化
- webservice Axis {http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: C
- 最大序列和问题
- 猜拳游戏(基于python面向对象2)
- Hibernate Part1
- Unix域协议
- 三种连接方式:bridge,NAT,host-only的区别
- C 语言中的指针
- Web简单文件下载
- Unix域套接字
- 「bzoj1095」ZJOI2007 HIDE