P1115 最大子段和

这篇具有很好参考价值的文章主要介绍了P1115 最大子段和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1复制

7
2 -4 3 -1 2 -4 3

输出 

4

说明/提示

样例 1 解释

选取 [3,5]子段 {3,−1,2},其和为 4。

法一:线性DP:

定义状态:

首先:先分析一下情况

由于我们想求最大值并且是截取一个子段那么一个数能否被纳入这个子段取决于它的贡献是否为正贡献,也就是说我们希望纳入子段的数是一个正数。

而能影响一个数是否能提供一个正贡献,一个因数是其本身的值,一个因数是它的前一个值能否带动它提供一个正数,例如-1本身是一个负贡献,如果它的前值为10,由于它的前值正贡献大于其本身的负贡献,我们也将其纳入其中.

由此定义DP[i]以i结尾的最大贡献

取 num[i] 的情况:

取 i : num[i]为正数

           num[i]为负 ,num[i - 1]的正贡献大于num[i]的负值 

    for(int i = 1;i <= n;i++)
    dp[i] = max(a[i],num[i] + dp[i - 1]);

线性DP == AC 代码

#include<bits/stdc++.h>
#define int i64
using i64 = int64_t;
using namespace std;
const int maxn = 2e5 + 10;
int dp[maxn];
int n, num[maxn];
int ans = -1e6;
signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    cin >> num[i];
    for(int i = 1;i <= n;i++)
    {
       dp[i] = max(num[i],num[i] + dp[i - 1]);
       ans = max(ans,dp[i]);
    }
    cout << ans << endl;
    return 0;
}

解法二:在线处理(数据结构中最基础的算法)

#include<bits/stdc++.h>
#define int i64
using i64 = int64_t;
using namespace std;
const int maxn = 2e5 + 10;
int n,sum, num[maxn];
int ans = -1e6;
signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    cin >> num[i];
    for(int i = 1;i <= n;i++)
    {
        if(sum < 0)sum = num[i];
        else sum += num[i];
        ans = max(ans,sum);
    }
    cout << ans << endl;
    return 0;
}

解法三:前缀和

我们知道前缀和是存储前i个和的值,那么对于最大子序列[i , j]的值就是前缀和中的s[j] - s[i - 1]

如果我们想让子序列和为最大,则我们希望s[j]尽可能大,以及s[i - 1]尽可能小,对于s[j]通过枚举每一个选项即可,那么最终取决于找到最小的s[i - 1]以及当前j的位置文章来源地址https://www.toymoban.com/news/detail-484400.html

#include<bits/stdc++.h>
#define int i64
using i64 = int64_t;
using namespace std;
const int maxn = 2e5 + 10;
int n,sum, num[maxn],s[maxn],m;
int ans = -1e6;
signed main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
       cin >> num[i];
       s[i] = num[i] + s[i - 1];
    }
    for (int i = 1; i <= n; i++)
    {
        ans = max(ans,s[i] - m);
        m = min(m,s[i]);
    }
    cout << ans << endl;
    return 0;
}

到了这里,关于P1115 最大子段和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉入门 3)最大池化

    计算机视觉入门 1)卷积分类器 计算机视觉入门 2)卷积和ReLU 计算机视觉入门 3)最大池化 计算机视觉入门 4)滑动窗口 计算机视觉入门 5)自定义卷积网络 计算机视觉入门 6) 数据集增强(Data Augmentation) 提示:仅为个人学习笔记分享,若有错漏请各位老师同学指出,Th

    2024年02月12日
    浏览(40)
  • 计算机组成原理之计算机硬件发展和计算机系统的组成

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年01月24日
    浏览(78)
  • 计算机基础--计算机存储单位

    计算机中表示文件大小、数据载体的存储容量或进程的数据消耗的信息单位。在计算机内部,信息都是釆用二进制的形式进行存储、运算、处理和传输的。信息存储单位有位、字节和字等几种。各种存储设备存储容量单位有KB、MB、GB和TB等几种。 位(bit):二进制数中的一个

    2024年02月03日
    浏览(80)
  • 计算机组成原理-计算机系统概述

    目录 一,基本组成  二、各部件工作原理 2.1存储器 2.2运算器  2.3控制器  2.4输入设备 2.5输出设备 一条指令的工作原理  三、计算机系统的层次结构  三种基本语言 四、计算机性能指标         “存储程序”的概念,指将指令以二进制代码的形式事先输入计算机的主存

    2024年02月05日
    浏览(89)
  • 计算机前沿(2022计算机前沿方向)

    时刻关注前沿研究方向,目前计算机前沿研究方向主要有一下几种。 机器智能,数据计算,机器人,金融科技,量子计算机,高端芯片,6G通信等。 在人工智能领域,基本是通过计算机来模拟人的听,说,读,写,看和脑子决策。 听(语音识别) 说(语音识别) 读(语音识

    2024年02月10日
    浏览(75)
  • 计算机组成原理 --- 计算机性能指标

    一.存储器的性能指标 1.MAR是地址寄存器,MDR是数据寄存器 2.MAR的位数能够体现最多存多少个地址,而每个地址就代表一个存储单元,所以MAR的位数能表示存储器中有多少个存储单元 3.MDR是数据寄存器,它的容纳极限 = 每个存储单元的容纳极限 --- 如果MDR的容纳极限小于存储单

    2023年04月08日
    浏览(84)
  • 计算机组成原理(一)计算机系统概论

    计算机组成原理这门课可以说是计算机专业最重要的基础,身为计算机专业非常重要,所以需要自己好好琢磨,不要应付考试。 计算机硬件系统的主要组成为五大部分,分别为存储器、运算器、控制器、输入设备和输出设备。 简述一下计算机的工作原理,假设要用计算机来

    2024年02月08日
    浏览(70)
  • 计算机视觉 计算机视觉识别是什么?

    计算机视觉识别(Computer Vision Recognition)是计算机科学和人工智能领域中的一个重要分支,它致力于使计算机系统能够模拟和理解人类视觉的过程,从而能够自动识别、分析和理解图像或视频中的内容。这一领域的发展旨在让计算机具备视觉感知和理解的能力,使其能够从视

    2024年02月07日
    浏览(53)
  • 计算机基础错题笔记_计算机一级

    ​  ​ 1 【单选题】 在微型计算机系统中,VGA是指________。   (A) 微机型号之一   (B) CDROM的型号之一   (C) 打印机型号之一   (D) 显示器的标准之一 答案:D 2 【单选题】 电子邮件是使用了下面的____ ___协议。   (A) TELNET   (B) UDP   (C) FTP   (D) SMTP 答案:

    2024年02月10日
    浏览(73)
  • 计算机组成原理(1)--计算机系统概论

    计算机系统由“硬件”和“软件”两大部分组成。 所谓“硬件”,是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机 设备的实物组成,如主机、外部设备等。 所谓“软件”,它看不见摸不着,由人们事先编制的具有各类特殊功能的程序组成。(

    2024年01月16日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包