求最大子序列

C++:

#include <stdint.h>
#include<string>
#include<iostream>
#include<vector>
using namespace std;

int maxSubSum(const vector<int> &a){
int maxSum = 0;
int thisSum = 0;
for (int i = 0; i < a.size(); i++){
thisSum += a[i];
if (thisSum>maxSum)
maxSum = thisSum;
else if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}

int main(){
vector<int> a = { 4, -1, 3, -7, -4, 5, 6, -9, 8 };
cout<<maxSubSum(a)<<endl;
system("pause");

}

动态规划,联机算法(on-line algorithm)

联机算法:在任意时刻,算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)。

算法复杂度O(n)

方法2:

使用递归的思想,将数列分为左半部分,右半部分和中间部分,其中左右部分可以用递归解决

而中间部分是前半部分(包含左半部分最后一个元素)的最大值和右半部分(包含右半部分的第一个值)的最大值的和

将这三个值做比较就是最终的结果

算法复杂度:O(N*logN)

时间: 2024-11-04 06:29:36

求最大子序列的相关文章

HDU 1003 Max Sum【动态规划求最大子序列和详解 】

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 250714    Accepted Submission(s): 59365 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

使用分治法求最大子序列之和

对于求最大子序列之和,对于我这样的菜鸟,首先想到的应该是最暴力的方法,就是将所有的子序列的和进行比较,然后出现最大值并返回答案.不过这也没啥意思,复杂度O(N2). 对这个问题,有一个相对复杂的O(NlogN)的解法,就是使用递归.其主要思想是:比较左.右.中间三部分的序列和的大小,因为中间部分是没办法分治的,只能在每一层递归函数空间里面进行,所以递归的部分为左.右,而且左右部分序列和有分别为次层递归的结果.递归的基本边界:左右为相同位置元素,即只有一个元素. 1 private static

(hdu step 3.2.1)Max Sum(简单dp:求最大子序列和、起点、终点)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1390 Accepted Submission(s): 542   Problem Descrip

分治策略结合递归思想求最大子序列和

我的主力博客:半亩方塘 对于 <数据结构与算法分析--C语言描述> 一书第 20 页所描述的算法 3,相信会有很多人表示不怎么理解,下面我由具体问题的求解过程出发,谈谈我自己的理解: 首先,什么是分治法呢?所谓 分治法,就是 将一个问题的求解过程分解为两个大小相等的子问题进行求解,如果分解后的子问题本身也可以分解的话,则将这个分解的过程进行下去,直至最后得到的子问题不能再分解为止,最后将子问题的解逐步合并并可能做一些少量的附加工作,得到最后整个问题的解.在求解原来整个问题的算法思想,与求解每一

求最大子序列和

问题:给定整数序列S[0],S[1],... S[N-1],子序列和是指S[i]+S[i+1]+...+S[j-2]+S[j-1],其中i,j, 0<= i <= j <= N-1,求所有这样的子序列和的最大值,即最大子序列和. 方法一:枚举法 O(N^2) 求出所有的子序列和,取其最大值.算法复杂度为O(N^2). int maxSubSeq1(int a[], int len)  {  int maxSum; int i, j; if (len <= 0) return MIN

CSU 1354 Distinct Subsequences 求不同子序列和 dp

题目链接:点击打开链接 题意: 给定一个长整数 求所有不同的子序列和. 思路: dp[i]表示以i数字为结尾的序列的和 num[i]表示以i数字为结尾的序列个数 import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; im

分治法求最大子序列

给定一个序列,下标为 i, i+1, i+2, ...... , j,设 mid = (i+j)/2, 则最大子序列可能出现的地方有三个,mid的左边,mid的右边,或者在中间(包括mid).只要求出左边和右边的最大子序列(子问题),和边界上左边和右边最大子序列的和,找出三个子序列中最大的即可. #include <iostream> using namespace std; /*分治法解决最大子序列问题*/ int MaxSubSum(const int a[], int left, int

动态规划求最大子序列

动态规划求最大连续子序列: 思想: 1.如果在array[1,N]中存在最大连续子序列array[i,j],那么对于任何的k(i<=k<=j)均有array[i,k]大于0.假设array[i,k]小于0,由条件知array[i,j]为最大连续子序列,且由等式array[i,k](小于0)+array[k+1,j]=array[i,j](最大连续子序列),知array[k+1,j]>arra[i,j],即array[k+1,j]为最大子序列.与已知条件矛盾. 2.因此,我们可以把arra

求数组子序列和最大值

输入一组整数,求出这组数字子序列和中的最大值,只要求出最大子序列的和,不必求出最大值对应的那个序列. 序列:-2 11 -4 13 -5 2 -5 -3 12 -9 最大子序列和为21 序列:0 -3 6 8 -20 21 8 -9 10 -1 3 6 5 最大子序列和为43 代码如下: 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n,a[20]; 6 cout<<"input n

分治法(求最大子序列和)

1 //求出最大子序列 4 ,-3,5,-2,-1,2,6,-2 2 #include <stdio.h> 3 int max (int a,int b,int c) 4 { 5 int ret; 6 if(a > b) 7 { 8 ret = a; 9 }else 10 if(a <= b) 11 { 12 ret = b; 13 } 14 if(ret >= c) 15 return ret; 16 else 17 return c; 18 } 19 int Findma