蓝桥杯中的最大子段和问题

题目内容:

给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].

输入描述

第一行为一个整数n,表示数组有n个数据,第二行依次输入n个整数

输出描述

计算出n个整数中连续k个数的最大和

输入样例

5

1 2 3 4 5

7

6 -5 5 8 -13 5 7

输出样例

15

14

分析:若记b[j]为由a中有元素1到元素j(1 <= j <= n)中的最大子段和,那么对于每个j的取值都会有一个子段的最大子段和,那么对于整个数组的最大子段和的求解就是找出这些小子段里面最大子段和中的最大的那个。之后由b的定义可知,如果b[j - 1] > 0,则b[j] = b[j - 1] + a[j],否则b[j] = a[ji],由此就可以得出求出最大子段和的递推公式

int MaxSum(int n,int a[])
{
	int i;
	int sum = 0,b = 0;
	for(i = 1;i <= n; i++)
	{
		if(b > 0)
			b = b + a[i];
		else
			b = a[i];
		if(b > sum)
			sum = b;
	}
	return sum;
}

代码其实很简单,是吧~~~!!!

时间: 2024-12-17 23:56:05

蓝桥杯中的最大子段和问题的相关文章

蓝桥杯中的合并排序问题

/*题目内容: 使用合并排序算法,对输入的n个数据进行按升序排序. 输入描述 分两行,第一行是整数n,第二行是n个整数,每个整数之间用空格间隔. 输出描述 按升序排序的n个整数 输入样例 8 9 8 7 6 5 4 3 2 输出样例 2 3 4 5 6 7 8 9*/ /*分析:合并排序中用到了分治,其中比较关键的两个部分是1:合并分组排序的递归2:将排序后的小数组合并 #include<stdio.h> #define M 100 void Merge(int a[],int b[],int

四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法.要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一个正整数N (N

Java冒泡排序法

我写的大部分博客,基本上都是留作日后回忆知识点所用,当然,如果我的文章能帮到道友们!我会更加的开心,与荣幸!如果有错误之处,请海涵,并指出问题所在,看见后我必加以修改,感谢!共勉.一起进步! 之前看过的一篇博客之中,总结了排序的效率的问题,基本上(不说死) 冒泡<选择<插入<快速(快速排序法的效率最高) 冒泡排序法: 概念: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

最大子段和及其拓展

1.最大子段和问题 问题定义:对于给定序列a1,a2,a3--an,寻找它的某个连续子段,使得其和最大(如果某子序列全是负数则定义该子段和为 0).如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20. ·状态设计: dp[i] (1 <= i <= N) 表示以 a[i] 结尾的最大连续子段和. 显然,dp[i] >= 0 (1 <= i <= N) 状态转移方程:dp[i] = max{dp[i-1] + a[i], 0} (2 <

最大子段和(分治法)

#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> #define N 1000005 using namespace std; int a[1005]; int calc(int s,int e,int &l,int &r) { int l1,l2,l3,r1,r2,r3; if(s==e) re

最大连续子段和的两种线性算法

问题描述:给一个数组a1,a2,...,an.求这个数组的最大连续子段和.(非空子段) 即,定义Sij=ai+...+aj,则题目要求的是 max{Sij}(1<=i<=j<=n) N^3枚举和优化之后的N^2枚举就不说了,还有NlogN的二分算法也不提,想了解的可以看我的另一篇博客:http://www.cnblogs.com/itlqs/p/5097504.html 这里主要详解两种O(n)的算法. 方法一:动态规划 dp[i]表示以第i位为结尾的最大子段和.那么转移方程就是:dp[