最大子段和

题目描述

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

输入格式

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

第二行有 \(n\) 个整数,第 \(i\) 个整数表示序列的第 \(i\) 个数字 \(a_i\)。

输出格式

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

样例 #1

样例输入 #1

7
2 -4 3 -1 2 -4 3

样例输出 #1

4

提示

样例 1 解释

选取 \([3, 5]\) 子段 \(\{3, -1, 2\}\),其和为 \(4\)。

数据规模与约定

  • 对于 \(40\%\) 的数据,保证 \(n \leq 2 \times 10^3\)。
  • 对于 \(100\%\) 的数据,保证 \(1 \leq n \leq 2 \times 10^5\),\(-10^4 \leq a_i \leq 10^4\)。

本题思路:

设计状态:dp[N]严格以i为结尾的连续区间最大值

设计转移:即当前连续区间有由上一个区间加上当前值,或者是另起炉灶

dp[i] = max(dp[i - 1] + a[i], a[i]);

注意

设计状态时,要保证我们是在一个连续区间内进行操作(避免拼不上的情况)

AC_code(pull型)

#include <iostream>

using namespace std;

const int N = 2 * 1e5 + 10;

int dp[N];//1~i中最大连续和
int a[N];
int n; void input() {
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> a[i];
} void solve() {
int res = -1e9;
for(int i = 1; i <= n; ++ i) {
dp[i] = max(dp[i - 1] + a[i], a[i]);
res = max(res, dp[i]);
}
cout << res << endl;
} int main() {
input(); solve();
}

本人思路

沿用课上思路,设计了状态dp[N]表示为以1~i中的最大连续(其实已经错了,这样设计状态当区间,当扩展到1~i+1时,1~i最大连续区间最后一位可能不是i,而是其他值,这样即无法构成连续区间)

设计转移:

dp[i] = max(dp[i], dp[i] + a[i]);

用了01背包选or不选思路一眼假(成功写成01背包),甚至正常求暴力都不会写的这么离谱,这样转移会导致只选择正数(也不满足连续区间定义)

luoguP1115 最大子段和的更多相关文章

  1. 最大子段和(c++)

    // 最大子段和.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namesp ...

  2. 51Node 1065----最小正子段和

    51Node  1065----最小正子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这 ...

  3. 最大M子段和 V2

    51nod1053 这题还是我们熟悉的M子段和,只不过N,M<=50000. 这题似乎是一个堆+链表的题目啊 开始考虑把所有正数负数锁在一起. 比如: 1 2 3 -1 –2 -3 666 缩成 ...

  4. 51nod 循环数组最大子段和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 对于普通的数组,只要求一次最大子段和即可.但是这题是可以循环的,所 ...

  5. [日常训练]最大M子段和

    Description 在长度为的序列中选出段互不相交的子段,求最大字段和. Input 第一行两个整数. 第二行个整数. Output 一行一个整数表示最大值. Sample Input 5 2 1 ...

  6. 51nod1049(计算最大子段和)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 题意:又是仲文题诶- 思路:暴力会超时,又好像没什么专门 ...

  7. XCOJ 1103 (LCA+树链最大子段和)

    题目链接: http://xcacm.hfut.edu.cn/problem.php?id=1103 题目大意:链更新.链查询,求树链的最大子段和.(子段可以为空) 解题思路: 将所有Query离线存 ...

  8. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  9. [51NOD1959]循环数组最大子段和(dp,思路)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这道题的最大子段和有两种可能,一种是常规的子段和,另一种 ...

  10. 转载:最大子段和问题(Maximum Interval Sum)

    一.问题描述         给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.或者求出最大的这个和.       例如(-2,11,- ...

随机推荐

  1. awk截取日志

    Posted on 2019-04-02 09:35 SZ_文彬 阅读(0) 评论(0)  编辑 收藏 好久没有截取nginx/haproxy 中 的日志了,竟有点不熟悉了. 记录一下,以免以后忘记. ...

  2. vue3适配移动端的登录实现

    <script lang="ts" setup> import { ref } from 'vue' const PHONE_NUMBER_REGEX = /^1[0- ...

  3. MacOS M1 安装python3.5

    因为没法通过brew直接安装python 3.5,因为brew库里已经没有这个版本的python了,因此只能曲线救国,大体流程: 安装brew 通过brew 安装 pyenv 然后通过pyenv 安装 ...

  4. Django中图片不显示

    很多教程没教对,导致Django中的图片不能正确的显示出来,经过多次踩坑,发现如下方法可以解决该问题. 1.setting.py中添加: STATIC_URL = '/static/' STATICF ...

  5. java初级笔记(翁恺男神

    一.基础 1.类型转换 两个整数的运算结果只能是整数(自动向下取整 自动类型转换(由低变高 强制类型转换(从高到低 2.运算符优先级 正负号>乘除取余>加减连接>关系运算符>赋 ...

  6. AI到底给我们带来什么?

    AI 如火如荼,尤其是最近半年,发展的速度超出想象.DeepSeek的出现,对于整个世界AI 界带来深渊影响. AI是当前"技术找技术"的极致产物, 它大幅提升了流程效率,但没有带 ...

  7. Linux vmstat命令快速入门

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入 ...

  8. Java集合源码--ArrayList的可视化操作过程

    关于ArrayList的元素插入.检索.修改.删除.扩容等可视化操作过程 还有关于ArrayList的迭代器.线程安全和时间复杂度 1. 底层数据结构 基于动态数组实现,内部维护一个Object[]数 ...

  9. asp.net mvc 获取请求服务器信息

    HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] /// <summary>        /// ...

  10. CompletableFuture保证线程同步

    目的:多线程执行某些任务,把执行完的结果放到list中,最后返回list. 1.list要保证线程安全 2.要等所有的线程都执行完,才能返回list 3.异常处理,若其中某个线程出现了异常,会导致其线 ...