【C++】最大子列和

  此题来自《数据结构与算法》,书中一共介绍了四种方法,这里贴出两种。

1.分治递归,对本题来说,虽然有更好的算法,但是用此题理解分治算法感觉挺有用

 1 #include <iostream>
 2 int maxsublink(int *a,int right,int left);
 3 using std::cout;
 4 using std::cin;
 5
 6 int main()
 7 {
 8     int a[8]={4,-3,5,-2,-1,2,6,-2};
 9     int maxnum=maxsublink(a,0,7);
10     cout<<maxnum;
11     return 0;
12 }
13 int maxsublink(int *a,int left,int right)
14 {
15     int rightmax,leftmax;
16     int leftbordermax,rightbordermax;
17     int leftborder,rightborder;
18
19     if(left==right)
20       {
21           if(a[left]>0)
22             return a[left];
23         else
24             return 0;
25       }
26     int mid,i;
27     mid=(right+left)/2;
28     leftmax=maxsublink(a,left,mid);
29     rightmax=maxsublink(a,mid+1,right);
30     leftborder=leftbordermax=0;
31     for(i=mid;i>=left;i--)
32     {
33         leftborder+=a[i];
34         if(leftborder>leftbordermax)
35             leftbordermax=leftborder;
36     }
37     rightborder=rightbordermax=0;
38     for(i=mid+1;i<=right;i++)
39     {
40         rightborder+=a[i];
41         if(rightborder>rightbordermax)
42             rightbordermax=rightborder;
43     }
44     int intermax=leftbordermax+rightbordermax;
45     if(intermax>=rightmax)
46     {
47         if(intermax>=leftmax)
48             return intermax;
49         else
50             return leftmax;
51     }
52     else
53     {
54         if(rightmax>=leftmax)
55             return rightmax;
56         else
57             return leftmax;
58     }
59 }

2.遍历整个数组,每个遍历的值保存入thissum,当thissum<0时,thissum置零;当thissum>max时,更新max

 这种方法时间复杂度可以达到O(n),感觉这种编程方法很值得学习,而且在别的算法中也经常用到,很典型。

 1 #include <iostream>
 2
 3 using namespace std;
 4 int maxsublink(int *a,int num);
 5 int main()
 6 {
 7     int a[8]={4,-3,5,-2,-1,2,6,-2};
 8     int maxnum=maxsublink(a,8);
 9     cout<<maxnum;
10     return 0;
11 }
12 int maxsublink(int *a,int num)
13 {
14     int i,thissum,maxsum;
15     maxsum=thissum=0;
16     for(i=0;i<num;i++)
17     {
18         thissum+=a[i];
19         if(thissum>maxsum)
20             maxsum=thissum;
21         else if(thissum<0)
22             thissum=0;
23     }
24     return maxsum;
25 }
时间: 2024-08-08 22:07:17

【C++】最大子列和的相关文章

数据结构习题记录(1)——最大子列和问题

题目: 给定KK个整数组成的序列{ N_1N?1??, N_2N?2??, ..., N_KN?K?? },"连续子列"被定义为{ N_iN?i??, N_{i+1}N?i+1??, ..., N_jN?j?? },其中 1 \le i \le j \le K1≤i≤j≤K."最大子列和"则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计

应用实例——最大子列和问题

题目描述:给定N个整数的序列{A1,A2,...,AN},求函数f(i,j)=max{0,ΣAk(i<=k<=j)}的最大值 算法1: 1 int MaxSubseqSum1(int A[],int N){ 2 int ThisSum,MaxSum=0; 3 int i,j,k; 4 for(i=0;i<N;i++){//i是子列左端位置 5 for(j=i;j<N;j++){//j是子列右端位置 6 ThisSum=0; 7 for(k=i;k<j;k++){//ThisS

2015/10/13 算法习题:最大子列和问题

已经正式开始学习数据结构和算法,先学了网易云课堂上的浙江大学的数据结构课,是陈越和何钦铭上的,了解了什么是数据结构和算法后,学习了一些时间空间复杂度分析的技巧,结合之前马虎掌握的学习,先从简单的题目入手学习. 题目是这样的: 给定了一个n个整数组成的序列,求它各个子列中,子列和最大的值. 输入:输入n个整数组成的序列 要求输出最大子列和. 示例: 输入: -2 11 -4 13 -5 -2 输出: 20 做出这题的难度不是很大,至少很容易可以做到暴力求解,然而暴力求解的时间复杂度是很大的. 我用

01-1. 最大子列和问题(20)

01-1. 最大子列和问题(20) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计算给定整数序列的最大子列和. 输入格式: 输入第1行给出正整数 K (<= 100000)

HDU 1003 &amp;&amp; HDU 1081(最大子列和,最大子矩阵和).

最大子列和,及其扩展最大子矩阵和,都是比较经典的dp,把这两题写在一起,共大家参考学习. ~~~~ lz弱菜啊,到现在还只能写这么水的DP...orz. ~~~~ 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 http://acm.hdu.edu.cn/showproblem.php?pid=1081 题意应该比较好理解,不解释了. 1003: #include<cstdio> #include<iostream> #inc

最大子列和问题(剑指offer和PAT)

01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N_1N?1??, N_2N?2??, ..., N_KN?K?? },“连续子列”被定义为{ N_iN?i??, N_{i+1}N?i+1??, ..., N_jN?j?? },其中 1 \le i \le j \le K1≤i≤j≤K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编

01-复杂度1. 最大子列和问题

给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计算给定整数序列的最大子列和. 输入格式: 输入第1行给出正整数 K (<= 100000):第2行给出K个整数,其间以空格分隔

01-复杂度1. 最大子列和问题(20)

给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.“最大子列和”则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计算给定整数序列的最大子列和. 输入格式: 输入第1行给出正整数 K (<= 100000):第2行给出K个整数,其间以空格分隔

复杂度_最大子列和问题(1)

给定K个整数组成的序列{ N1??, N2??, ..., NK},"连续子列"被定义为{ Ni??, Ni+1??, ..., Nj},其中 1≤i≤j≤K."最大子列和"则被定义为所有连续子列元素的和中最大者.例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20.现要求你编写程序,计算给定整数序列的最大子列和. 本题旨在测试各种不同的算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:与样

最大子列和问题(20)

输入格式: 输入第1行给出正整数 K (<= 100000):第2行给出K个整数,其间以空格分隔. 输出格式: 在一行中输出最大子列和.如果序列中所有整数皆为负数,则输出0. 输入样例: 6 -2 11 -4 13 -5 -2 输出样例: 20 最大子列和的算法很多,最简单的可以用三重循环来做,不过O(N^3)的时间复杂度... MOOC里陈越姥姥提到的最优算法在线搜索的时间复杂度是O(N) 下面贴出代码 #include <iostream> using namespace std;