最大子段和

题目描述

给出一个长度为 \(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. 卷积神经网络 CNN BP算法推导

    重点在对CNN的理解后, 理解对卷积层的的 梯度(导数) 推演. 回顾 CNN 首先是对神经网络, 前向, 后向的基本认识. 神经网络初步认识来看, 跟传统的 ML 理论的区别在于, 它更像一个经验的 ...

  2. 用JavaScript打造全新编程语言:从无到有的完整实践指南

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  3. 【实战】深入浅出 Rust 并发:RwLock 与 Mutex 在 Tauri 项目中的实践

    引言 你是否遇到过 Rust 并发场景下的资源竞争.性能瓶颈? 当多个线程同时抓取网页导致 IP 被封.多线程读写本地数据引发一致性问题时,如何优雅地实现线程安全? 本文结合开源项目 Saga Rea ...

  4. Java 自定义线程池的任务

      在<Java 自定义线程池的线程工厂>一文中介绍了如何优雅地自定义线程工厂,本文介绍如何自定义线程池的任务,并拿到返回值.   首先自定义一个任务类,实现Callable接口,重写ca ...

  5. win10将python打包成apk详细文档

    打包不支持windows所以可以找一台linux的电脑 或者用win10子系统(推荐) 我用的是Ubuntu 方法:https://www.jianshu.com/p/fcf21d45ea74 我简单 ...

  6. C#获得项目最后编译时间

    C#获得项目最后编译时间 效果 具体格式可以自定义 核心代码 string GetCompileVersion() { string OriginVersion = "" + Sy ...

  7. chatgpe脚本系列 - 分析nginx攻击日志,并自动加入防火墙黑名单

    脚本内容 #!/bin/bash # 日志文件路径 LOG_FILE="/var/log/nginx/access.log" # Fail2Ban 过滤器路径 FILTER_FIL ...

  8. 红色教育软件需求分析 NABCD

    N(need) 红色教育指在以红色作为时代精神内涵的象征.务实的落点在于教育.要呼唤有志青年忧国忧民.挑战自我.超越自我.挑战极限.奉献社会的崇高精神.而我们大学生作为实现中华民族伟大复兴的有生力量, ...

  9. AppBox拖拽设计增删改查用户界面

      之前为了应对客制化大屏设计的需求,在框架内实现了拖拽方式(动态化)生成用户界面的功能,跟大部分实现方式差不多,设计时生成配置json,然后在运行时解析json生成用户界面.这次完善了一下该功能,支 ...

  10. 在x86的window安装arm64虚拟机

    安装qemu msys2:官网 按照下图步骤下载文件并安装 打开下面终端 根据:qemu官网 在终端执行安装命令:pacman -S mingw-w64-ucrt-x86_64-qemu 下载系统镜像 ...