最大和子序列问题

这个问题是算法导论的一个示例,为了讲解分治。

 1 //算法导论中的分治策略版本
 2
 3
 4 #include<iostream>
 5 using namespace std;
 6 int maxCrossSum(int a[], int begin, int mid, int end)
 7 {
 8     int sumLeft = a[mid];
 9     int sumNow=0;
10     for (int i = mid; i >= begin; --i)
11     {
12         sumNow += a[i];
13         if (sumNow > sumLeft)
14             sumLeft = sumNow;
15     }
16     int sumRight = a[mid + 1];
17     sumNow = 0;
18     for (int i = mid + 1; i <= end; ++i)
19     {
20         sumNow += a[i];
21         if (sumNow > sumRight)
22             sumRight = sumNow;
23     }
24     return sumLeft + sumRight;
25 }
26 int maxSubArray(int a[], int begin, int end)
27 {
28     if (begin == end)
29         return a[begin];
30     else
31     {
32         int mid = (begin + end) / 2;
33         int leftSum = maxSubArray(a, begin, mid);
34         int rightSum = maxSubArray(a, mid + 1, end);
35         int crossSum = maxCrossSum(a, begin, mid, end);
36         int sum;
37         if (leftSum > rightSum)
38             sum = leftSum;
39         else sum = rightSum;
40         if (sum < crossSum)
41             sum = crossSum;
42         return sum;
43     }
44 }
45 int main()
46 {
47     const int SIZE = 13;
48     int a[SIZE] = { -3, -15, 20, -3, -16, -23, 18, 20, -9, 12, -5, -22, 15 };
49     int maxsubarray = maxSubArray(a, 0, 12);
50     cout << maxsubarray << endl;
51     system("pause");

这里提供一个更加简便的方法:

 1 更加高效的版本,无须递归,O(n)的时间复杂度
 2 #include<iostream>
 8 using namespace std;
 9 int maxSubArray(int a[], int begin, int end)
10 {
11     int sum = 0;
12     int i = 0;
13     int maxSum = 0;
14     for (int i = begin; i <= end; ++i)
15     {
16         sum += a[i];
17         if (sum > maxSum)
18             maxSum = sum;
19         //cout << maxSum << endl;
20         if (sum < 0)
21             sum = 0;
22     }
23
24     return maxSum;
25 }
26 int main()
27 {
28     const int SIZE = 13;
29     int a[SIZE] = { -3, -15, 20, -3, -16, -23, 18, 20, -9, 12, -5, -22, 15 };
30     int maxsubarray = maxSubArray(a, 0, 12);
31     cout << maxsubarray << endl;
32     system("pause");
33 }  

此处不得不说,后面的方法兼具大气魄,有远见等特点,方能如此简单便捷!

最大和子序列问题,布布扣,bubuko.com

时间: 2024-10-15 10:04:59

最大和子序列问题的相关文章

最大和子数组/最大和子序列

最大和子数组是数组中和最大的子数组,又名最大和子序列.子数组是数组中连续的n个元素,比如a2,a3,a4就是一个长度为3的子数组.顾名思义求最大和子数组就是要求取和最大的子数组. n个元素的数组包含n个长度为1的子数组:{a0},{a1},…{an-1}: n个元素的数组包含n-1个长度为2的子数组:{a0,a1},{a1,a2},{an-2,an-1}: ……………………………………………………………………………………………… n个元素的数组包含1个长度为n的子数组:{a0,a1,…,an-1

环状最大和子序列 ---- 蚂蚁的难题(二)

求环状最大和子序列  方法是    先求出 不循环的情况下的 最大和子序列 , 和最小和子序列  ,  然后 所有数字的和-最小和子序列 和 最大和自序列里面找一个 最大值 就是  最终的最大值 http://115.159.40.116/problem_show.php?pid=5543 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #i

求最大和子序列

? 今天来看一个简单的问题,求最大的和子序列/求最大和子数组,题目是这样的:已知序列:-2, 11, -4, 13, -5, 2, -5, -3, 12, -9,求此序列的最大子序列和 ? 其实题目很简单,但智障的我一开始弄错了,直接把所有负数提出去然后把剩下的相加,这也太简单了点吧....后来想想,貌似不太对,于是,重来.一共用了三种方法.(名字都是我瞎写的) 方法一:暴力法 ? 没错,就是直接把这个数组的所有子序列的和都算一遍,跟初始最大值比较,代码如下:   int main()   {

[经典] 最X(长 | 大和 | 大积)Y(子序列 | 子字符串)

Note: 子序列,可以不连续:子字符串,必须连续. 以下题目按在我看看来的难度从易到难排列: 最大和子序列(Maximum sum subsequence) 这道题纯属娱乐...应该不会有人出这种题吧.方案是遇到正数就放入序列. vector<int> msseq(vector<int> &num) { vector<int> result; for(int i : num) if(i > 0) result.push_back(i); return r

LIS LCS 最长上升子序列 最长公共子序列 ...

最长上升子序列,问题定义:http://blog.csdn.net/chenwenshi/article/details/6027086 代码: public static void getData( char[] L ) { int len = L.length; int[] f = new int[len]; String[] res = new String[len]; for( int i = 1; i < len; i++ ) { f[i] = 1; res[i] = "&quo

HDU 1081 DP找最大和的矩阵

题目大意: 在一个给定的大矩阵中找一个小型的矩阵,使这个矩阵中的元素和最大 可以先来看下面这个问题: 原来有做过在一个给定的数字序列中找一个最大和子序列,核心代码如下: 1 int _max = num[0]; 2 int sum = num[0]; 3 int st = 0; 4 int la = 0; 5 int rec; 6 for(int i = 1 ; i<k ; i++){ 7 if(sum < 0){ 8 rec = i;//记录起点 9 sum = 0; 10 } 11 sum

最大子序列和算法分析&mdash;&mdash;好的算法对于编程是多么重要!!!

昨天晚上在宿舍看Mark Allen Weiss老爷子的<数据结构与算法分析Java语言描述>的这本书,看到第二章的时候举了个例子来讨论,就是关于最大子序列和的算法分析.一共提了四个算法,首先当你看见第一个算法的时候觉得这个算法不错,可以实现,再接着当你看到后面连着的三个例子的时候这才明白算法一步步的优化对于整个性能的提升,有时候我们不是想不出来好的算法,只是当第一种算法出来得时候我们的思维已经被局限化了,觉得是对的就以为是唯一解了,实感唏嘘! 早上来到实验室特地找了一些资料,贴在这里,以后多

转~最大连续子序列求和

最大连续子序列求和详解 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