首页 > 其他分享 >luoguP1115 最大子段和

luoguP1115 最大子段和

时间:2024-05-20 10:31:18浏览次数:28  
标签:10 最大 luoguP1115 子段 int leq 区间 dp

最大子段和

题目描述

给出一个长度为 \(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背包),甚至正常求暴力都不会写的这么离谱,这样转移会导致只选择正数(也不满足连续区间定义)

标签:10,最大,luoguP1115,子段,int,leq,区间,dp
From: https://www.cnblogs.com/OVSolitario-io/p/18201353

相关文章

  • 152- Maximum Produce Subarray-最大子数组之乘积
    问题描述Givenanintegerarray nums,finda subarray.thathasthelargestproduct,andreturn theproduct.Thetestcasesaregeneratedsothattheanswerwillfitina 32-bit integer.解释:找出一个数组中乘积最大的子数组,返回子数组的乘积。案例:Input......
  • 在Linux中,如何找出最大的文件或目录?
    在Linux中,查找最大的文件或目录可以通过一些命令行工具轻松实现。这里介绍几种常用的方法:1.查找最大的文件使用du和sort命令:首先,使用du命令计算指定目录下所有文件和子目录的大小,并结合sort命令按大小排序。示例:查找当前目录下最大的10个文件du-ah.|sort-rh|h......
  • 指针练习5*5矩阵最大最小值
    将最大值放在5*5矩阵中央将左上右上左下右下分别放第1,2,3,4的最小值#include<stdio.h>#include<math.h>#include<string.h>#defineN5voidMove(int(*arr)[N]);int*Max(int(*arr)[N]);voidMin4(int(*arr)[N]);voidSwap(int*x,int*y);intmain(){intarr[5]......
  • Python 实现任意多边形的最大内切圆算法_任意多边形最大内切圆算法
    CSDN搬家失败,手动导出markdown后再导入博客园参考Matlab计算轮廓内切圆初衷是为了求裂缝的最大宽度![[output/attachments/5ecf17abcb54aaa4fb35b00c3f243f32_MD5.png]]直接上代码importrandomimportcv2importmathimportnumpyasnpfromnumpy.maimportcos,......
  • 二分图的最大匹配(匈牙利算法)代码
    二分图的最大匹配代码#include<bits/stdc++.h>usingnamespacestd;constintN=505,M=100005;inth[N],e[M],ne[M],idx;intmatch[N];boolst[N];intn1,n2,m;voidadd(inta,intb){e[idx]=b;//e[idx]存放的是第idx条边的终点ne[idx]=h......
  • 152. 乘积最大子数组
    给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个32-位整数。示例1:输入:nums=[2,3,-2,4]输出:6解释:子数组[2,3]有最大乘积6。示例2:输入:nums=[-2,0,-1]输......
  • 力扣-84. 柱状图中最大的矩形
    1.题目介绍题目地址(84.柱状图中最大的矩形-力扣(LeetCode))https://leetcode.cn/problems/largest-rectangle-in-histogram/题目描述给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示......
  • 最大报销额
    传送锚点:https://acm.hdu.edu.cn/showproblem.php?pid=1864ProblemDescription现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆......
  • 最小子段和
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10#defineMAX_RANDOM_NUM20/***求最大子段和*情况1:左子段长*情况2:右子段长*情况3:右子段一部分和左子段一部分相连长*@paramarr数组*@paramleft左......
  • Python 中寻找列表最大值位置的方法
    前言在Python编程中,经常需要对列表进行操作,其中一个常见的任务是寻找列表中的最大值以及其所在的位置。本文将介绍几种方法来实现这个任务。方法一:使用内置函数max()和index()Python提供了内置函数max()来找到列表中的最大值,同时可以使用index()方法找到该最大值在......