P1115 最大子段和(在线处理)

简介: P1115 最大子段和(在线处理)

1.描述:


给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。


2. 输入:


第一行是一个整数,表示序列的长度 n。

第二行有 n个整数,第 i 个整数表示序列的第 i 个数字 ai


3.输出:


输出一行一个整数表示答案。


4.样例输入:


7
2 -4 3 -1 2 -4 3


5.样例输出:


4


6.题目大意:


求最大子段和


7.思路


在线处理:

首先说最大子列和为非负的一个性质


如果整数序列image.png的 最大子列和为image.png那么必定有

image.png

对任意的image.png 成立

我对这个性质的理解就是,如果从头开始截取任一段和为负数,那么就与初始条件这是 最大子列 矛盾,这一段是负数我们完全可以不要它。(也就是说,最大子列 前面的元素和一定是负的,这样才被舍弃掉了)我们可以用这个性质进行在线处理,只要当前子列和为负,我们舍弃这一部分即可,不断比较求出一个最大的子列和


当然我们不能忽略一个特殊情况,就是最大子列和为负的情况,只有一个情况会使最大子列和为负,那就是整数序列中所有元素都是负数,这时它的最大子列中肯定也只有一个元素,就是所有负数里最小的那个元素,这对我们这个算法也没影响,每累加一次子列和就进行一次打擂台,进行一次清空,结果就是那个最大的负数,答案也正确,注意把最开始打擂台的数设成一个非常小的数。


8.代码


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
int n;
int a;
ll sum;
ll max1=-1e9+10;
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    scanf("%d",&a);
    sum+=a;//求子列和
    max1=max(sum,max1);//打擂台比较
    if(sum<0) sum=0;//子列和为负就清空
  }
  cout<<max1;
}

目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能
【洛谷 P1028】[NOIP2001 普及组] 数的计算 题解(递推)
在NOIP2001普及组的数的计算题目中,给定自然数`n`,需构造遵循特定规则的合法数列。合法序列始于`n`,新元素不超过前一项的一半。任务是找出所有这样的数列数量。例如,当`n=6`时,合法序列包括`6`, `6,1`, `6,2`, `6,3`, `6,2,1`, `6,3,1`。程序通过动态规划求解,当`i`为奇数时,`a[i] = a[i - 1]`;为偶数时,`a[i] = a[i - 1] + a[i / 2]`。代码中预处理数组`a`并输出`a[n]`作为答案。输入`n`后,程序直接计算并打印合法数列个数。
68 0
|
5月前
|
机器学习/深度学习 人工智能
PTA之N个数求和(细节题)天梯赛
编程题,要求计算以分子/分母形式给出的一组有理数的和,输出结果也要是最简有理数形式。输入包含正整数N(N≤100)及N个有理数,输出为和的最简形式。示例:输入5个数2/5, 4/15, 1/30, -2/60, 8/3,输出3 1/3;输入2个数4/3, 2/3,输出2。代码中包含求最大公约数的函数和计算有理数和的主要逻辑。
42 0
|
6月前
|
人工智能 算法 Java
K倍区间(蓝桥杯每日一题)
K倍区间(蓝桥杯每日一题)
58 0
|
6月前
|
算法
倍增在线求LCA
倍增在线求LCA
30 0
|
C++
蓝桥杯 2240. 买钢笔和铅笔的方案数c++解法
蓝桥杯 2240. 买钢笔和铅笔的方案数c++解法
137 0
算法练习Day44|70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数
算法练习Day44|70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数
|
人工智能 索引
洛谷P1005 [NOIP2007 提高组] 矩阵取数游戏
洛谷P1005 [NOIP2007 提高组] 矩阵取数游戏
|
算法 C++
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
108 0
【寒假每日一题】AcWing 3400. 统计次数(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
51 0
|
算法 Go 索引
算法练习第三天——杨辉三角
给定一个非负整数 num, 生成「杨辉三角」的前 num 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
算法练习第三天——杨辉三角