求解最大连续子序列和问题

解法1:maxSubSum1(a,n)算法中用三重循环来穷举所有的连续子序列,计算它们的和,时间复杂度为T(n) = O(n^3)。

 1 long maxSubSum1(int a[],int n)
 2 {
 3     int i,j,k;
 4     long maxSum = a[0],thisSum;
 5     for(i = 0;i < n;i++)
 6     {
 7         for(j = i;j < n;j++)//两重循环穷举所有连续子序列
 8         {
 9             thisSum = 0;
10              for(k = i;k <= j;k++)
11              {
12                  thisSum += a[k];
13              }
14              if(thisSum > maxSum)maxSum = thisSum;
15         }
16     }
17     return maxSum;//将maxSum的值返回给函数结果
18 } 

解法2:改进前面的解法,再求两个相邻子序列之和时,它们之间是关联的,在前者计算出来后,求后者时只需在前者的基础上加上一位数就是后者的连续子序列之和,不需要每次都重复计算,从而提高了算法的效率。时间复杂度T(n) = O(n^2)。

 1 long maxSubSum2(int a[],int n)
 2 {
 3     int i,j;
 4     long maxSum = a[0],thisSum;
 5     for(i = 0;i <= n;i++)
 6     {
 7         thisSum = 0;
 8         for(j = i;j < n;j++)
 9         {
10             thisSum += a[j];
11             if(thisSum > maxSum)maxSum = thisSum;
12         }
13     }
14     return maxSum;
15 }

解法3:进一步改进解法2,如果扫描中遇到负数,当前子序列和thisSum将会减小,若thisSum为负数,表明前面扫描的子序列已经可以抛弃了,则放弃这个子序列,重新开始下一个子序列的分析,并置thisSum为0。若这个子序列和不断增加,那么最大子序列和也不断增加。时间复杂度T(n) = O(n)。

 1 int maxSubSum3(int a[],int n)
 2 {
 3     int i,maxSum = 0,thisSum = 0;
 4     for(i = 0;i < n;i++)
 5     {
 6         thisSum += a[i];
 7         if(thisSum < 0)
 8             thisSum = 0;
 9         if(maxSum < thisSum)
10             maxSum = thisSum;
11     }
12     return maxSum;
13 }

昨天听算法设计课时听到这些思想我感觉到了算法的美好,所有的程序源码在下面,感兴趣的小伙伴可以试试。

 1 #include <stdio.h>
 2 long maxSubSum1(int a[],int n)//解法1
 3 {
 4     int i,j,k;
 5     long maxSum = a[0],thisSum;
 6     for(i = 0;i < n;i++)
 7     {
 8         for(j = i;j < n;j++)//两重循环穷举所有连续子序列
 9         {
10             thisSum = 0;
11              for(k = i;k <= j;k++)
12              {
13                  thisSum += a[k];
14              }
15              if(thisSum > maxSum)maxSum = thisSum;
16         }
17     }
18     return maxSum;//将maxSum的值返回给函数结果
19 }
20 long maxSubSum2(int a[],int n)//解法2
21 {
22     int i,j;
23     long maxSum = a[0],thisSum;
24     for(i = 0;i <= n;i++)
25     {
26         thisSum = 0;
27         for(j = i;j < n;j++)
28         {
29             thisSum += a[j];
30             if(thisSum > maxSum)maxSum = thisSum;
31         }
32     }
33     return maxSum;
34 }
35 int maxSubSum3(int a[],int n)//解法3
36 {
37     int i,maxSum = 0,thisSum = 0;
38     for(i = 0;i < n;i++)
39     {
40         thisSum += a[i];
41         if(thisSum < 0)
42             thisSum = 0;
43         if(maxSum < thisSum)
44             maxSum = thisSum;
45     }
46     return maxSum;
47 }
48 /*主函数*/
49 int main()
50 {
51     int a[] = {-2,11,-4,13,-5,-2},n = 6;
52     int b[] = {-6,2,4,-7,5,3,2,-1,6,-9,10,-2},m = 12;
53     printf("解法1:a序列的最大连续子序列和:%ld\n",maxSubSum1(a,n));
54     printf("解法1:b序列的最大连续子序列和:%ld\n",maxSubSum1(b,m));
55     printf("解法2:a序列的最大连续子序列和:%ld\n",maxSubSum2(a,n));
56     printf("解法2:b序列的最大连续子序列和:%ld\n",maxSubSum2(b,m));
57     printf("解法3:a序列的最大连续子序列和:%ld\n",maxSubSum3(a,n));
58     printf("解法3:b序列的最大连续子序列和:%ld\n",maxSubSum3(b,m));
59 } 

程序源代码

原文地址:https://www.cnblogs.com/ma1998/p/11640795.html

时间: 2024-10-11 05:57:02

求解最大连续子序列和问题的相关文章

归纳法求解最大连续子序列

(原文链接:http://www.karottc.com/blog/2014/09/07/maximum-consecutive-subsequence/) 问题 求最大连续子序列的问题描述如下: 给定一个实数序列 x1, x2, ... , xn(不必是正数),寻找一个(连续的)子序列 xi, xi+1, ... , xj,使得其数值之和在所有连续子序列数值之和中是最大的. 这个问题就是最大子序列问题,所求的的这个序列就叫做--最大子序列.下面通过数学归纳法来分析和解决这个问题,解决这个问题的

最大连续子序列和

对于给定的数组 numnum,一个长度为 ss 的连续子序列是指由 num_i,num_{i+1},num_{i+2}\ldots,num_{i+s-1}num?i??,num?i+1??,num?i+2??…,num?i+s−1?? 组成的序列.数组中的元素有可能为正数.负数或 00.你需要从数组中找出元素总和最大的一个连续子序列. 比如,对于数组 1,-3,2,6,-5,81,−3,2,6,−5,8,其最大连续子序列之和是 2+6-5+8=112+6−5+8=11. 对于一段区间内的最大连续

最大连续子序列乘积

问题描述 给定一个整数序列(可能有正数,0和负数),求它的一个最大连续子序列乘积.比如给定数组a={3, -4, -5, 6, -2},则最大连续子序列乘积为360,即3*(-4)*(-5)*6=360. 分析 求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0. 假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程

sjtu oj 1250 最大连续子序列问题变形

这道题目不知道是因为做的人少还是什么原因,pass率很低,我在去图书馆的路上忽然想起这道题目和最大连续子序列其实是一个问题,但是更难,更挑剔! 1250. BestSubsequence Description LL有n个妹子,他给妹子们编号排成一排.据说今天天气大好,LL要去春游了,他决定要选定至少F个妹子一起去玩. 为了让妹子们开心,他决定选连续一段的妹子们.然后LL有个特殊的癖好,他喜欢体重比较厉害一些的妹子. 那你可以帮LL选妹子吗,使得选出来的这些妹子的平均体重最大. Input Fo

算法-最大连续子序列和

题目:给定(可能是负的)整数A1.A2.….AN,求出并确定对应的序列的最大值.如果所有的整数都是负数,那么最大连续子数列和就是0,只是求出最大值,不需要求出具体的序列,作为这个题目的变种有很多情况下给你一个确定的数列,具体求和,大同小异,共有四种解法,按照时间复杂度来解,object-c实现,解法如下: 穷举法 这个应该是这个题目最容易想到的方式,通过循环遍历出所有的序列组合,求出最大的序列的最大值,代码如下: -(NSInteger)maxSubsequenceSum:(NSArray *)

数组的最大连续子序列

今天在网上看到的这道题目: 一个有N个元素的整型数组arr,有正有负,数组中连续一个或多个元素组成一个子数组,这个数组当然有很多子数组,求子数组之和的最大值.例如:[0,-2,3,5,-1,2]应返回9,[-9,-2,-3,-5,-3]应返回-2. 开始感觉貌似也没有那么难,就直接想循环遍历+动态规划的方法写即可.O(n2)的复杂度,感觉略大,想到上次关于最大子矩阵方法适合的O(n)的方法,感觉这个问题肯定也有这样的解法.在网上搜罗了一下,果真有各种简单的方法,仔细一看,这些方法之间还有关联性,

转~最大连续子序列求和

最大连续子序列求和详解 1.        问题描述 输入一个整数序列(浮点数序列也适合本处讲的算法),求出其中连续子序列求和的最大值. 2.        算法分析 2.1.        算法一 2.1.1.       算法描述 遍历所有子序列并求和,比较得出其中的最大值. 2.1.2.       代码描述 1          public static int maxSubSumCubic(int[] array) { 2                 int maxSum = 0

最大连续子序列求和详解

最大连续子序列求和详解 1.        问题描述 输入一个整数序列(浮点数序列也适合本处讲的算法),求出其中连续子序列求和的最大值. 2.        算法分析 2.1.        算法一 2.1.1.       算法描述 遍历所有子序列并求和,比较得出其中的最大值. 2.1.2.       代码描述 1          public static int maxSubSumCubic(int[] array) { 2                 int maxSum = 0

动态规划:最大连续子序列乘积

题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第i个数结尾的连续子序列最大乘积, 若题目要求的是最大连续子序列和,则易确定状态转移方程为: dp[i]=max(data[i],dp[i-1]+data[i])(dp[i]为以第i个数结尾的连续子序列最大和) 但乘积存在负负得正的问题,即原本很小的负数成了一个负数反而变大了,(负数逆袭了), 故不能