【动态规划基础】求最大连续子序列和——最大子段和

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

最大子段和

题目描述

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

输入格式

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

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

输出格式

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

样例

样例输入

7
2 -4 3 -1 2 -4 3

样例输出

4

提示

样例 1 解释

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

数据规模与约定
  • 对于 40 % 40\% 40% 的数据,保证 n ≤ 2 × 1 0 3 n \leq 2 \times 10^3 n2×103
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 2 × 1 0 5 1 \leq n \leq 2 \times 10^5 1n2×105 − 1 0 4 ≤ a i ≤ 1 0 4 -10^4 \leq a_i \leq 10^4 104ai104

基本方法

当解决最大连续子序列和问题时,可以使用两种基本方法:暴力法和动态规划法。

纯暴力

暴力法是最直观的解决方法,它通过遍历所有可能的子序列,并计算它们的和,最后返回最大的和。具体步骤如下:
初始化一个变量 m a x x maxx maxx为负无穷大,用于记录最大和。
使用两个嵌套循环遍历所有可能的子序列起点和终点。
在内层循环中,计算当前子序列的和,并将其与 m a x x maxx maxx进行比较,更新 m a x x maxx maxx
最后返回 m a x x maxx maxx作为结果。
例如,对于序列 [ − 2 , 1 , − 3 , 4 , − 1 , 2 , 1 , − 5 , 4 ] [-2, 1, -3, 4, -1, 2, 1, -5, 4] [2,1,3,4,1,2,1,5,4],暴力法将遍历所有可能的子序列,计算它们的和,并返回最大的和,即 6 6 6,对应子序列 [ 4 , − 1 , 2 , 1 ] [4, -1, 2, 1] [4,1,2,1]

暴力法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n是序列的长度。

动态规划法

动态规划法是一种更高效的解决方法,它通过利用子问题的最优解来构建整个问题的最优解。具体步骤如下:
初始化两个变量 m a x x maxx maxx l l ll ll,分别用于记录全局最大和和当前子序列的和。
遍历整个序列,对于每个元素,将其与 l l ll ll相加,如果结果大于当前元素本身,则更新 l l ll ll为相加结果;否则,将 l l ll ll更新为当前元素。
在每次更新 l l ll ll时,将其与 m a x x maxx maxx进行比较,如果 l l ll ll大于 m a x x maxx maxx,则更新 m a x x maxx maxx l l ll ll
最后返回 m a x x maxx maxx作为结果。
例如,对于序列 [ − 2 , 1 , − 3 , 4 , − 1 , 2 , 1 , − 5 , 4 ] [-2, 1, -3, 4, -1, 2, 1, -5, 4] [2,1,3,4,1,2,1,5,4],动态规划法将遍历整个序列,计算当前子序列的和,并更新 m a x x maxx maxx l l ll ll。最终,返回 m a x x maxx maxx的值为 6 6 6,对应子序列 [ 4 , − 1 , 2 , 1 ] [4, -1, 2, 1] [4,1,2,1]

动态规划法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n是序列的长度。

总结: 暴力法是一种简单直观的解决方法,但在处理大规模序列时效率较低。动态规划法通过利用子问题的最优解,将问题分解为更小的子问题,从而提高了效率。在实际应用中,动态规划法是解决最大连续子序列和问题的常用方法。文章来源地址https://www.toymoban.com/news/detail-769881.html

A C 代码

#include <bits/stdc++.h>
using namespace std;
long long n,a,ll,maxx;
int main() {
	cin >>n >>a;
	ll=a; maxx=a;
	for (int i=2;i<=n;i++)
	{
		cin >>a;
		if (ll+a<0)
			ll=0;
		else
		{
			ll+=a;
			maxx=max(maxx,ll);
		}
	}
	cout <<maxx;
	return 0;
}

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

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

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

相关文章

  • 动态规划之连续乘积最大子数组 & 连续和最大子数组

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:

    2024年02月10日
    浏览(39)
  • 动态规划---最长连续子序列问题

    最长连续子序列问题算是动态规划问题中的一个小分支,这里单独写一篇文章介绍。至于动态规划基础问题和详细的处理步骤我在我的另一篇文章中详细介绍过。具体解决步骤请移步观看——动态规划基础篇。如果想了解01背包问题和滚动数组相关内容请移步观看——动态规

    2024年02月15日
    浏览(26)
  • 代码随想录 动态规划-子序列问题-子序列(连续)

    目录 674.最长连续递增序列  718.最长重复子数组 53.最大子数组和  674. 最长连续递增序列 简单 给定一个未经排序的整数数组,找到最长且  连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列  可以由两个下标  l  和  r ( l r )确定,如果对于每个  l = i r ,都

    2024年04月09日
    浏览(40)
  • 题解53 | #动态规划#连续子数组的最大和(一)(二)#

    题解 | #链表中倒数第k个结点# /** * struct ListNode { * int val; * struct ListNode *next; * }; *//** * * @par   第一次面试 c++后端开发 会问什么呀,第一次面试没一点经验   题解 | #求二叉树的层序遍历# # class TreeNode:# def __init__(self, x):# self.val = x# sel   题解 | #牛客网连续练习题目3天及以上的

    2024年02月04日
    浏览(36)
  • 【动态规划】NK刷题之DP7 连续子数组的最大乘积

    ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞在一切变好之前,我们总要经历一些不开心的日子,这段日子也许很长,也许只是一觉醒来。有时候,选择快乐,更需要勇气。 🍉 如果你也迷失在了路上,对人生充满了迷惘,不要害怕,冷静下来,

    2024年02月08日
    浏览(38)
  • (动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】

    难度:简单 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为 O(n) 。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示 : 1 = a r r . l e n g t h = 1 0 5 1 = arr.length = 10^

    2024年02月11日
    浏览(42)
  • 动态规划(一) 变态青蛙跳台阶、最大连续子数组和、字符串分割 附源码讲解

    实现 import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNext()){ int length = scan.nextInt(); int[] array = new int[length]; for (int i = 0; i length; i++) { array[i] = scan.nextInt(); } System.out.println(findResult(array)); } } private static int findResult(int[] array) {

    2024年04月17日
    浏览(40)
  • LeetCode | C++ 动态规划——300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

    300题目链接 dp 数组定义 dp[i] 表示 i 之前包括 i 的以 nums[i]结尾 的最长递增子序列的长度 需要包含nums[i]结尾,不然在做递增比较的时候,就没有意义了。 递推公式 位置 i 的最长递增子序列 等于 j 从 0 到 i - 1各个位置的最长递增子序列 + 1 的 最大值 if (nums[i] nums[j]) dp[i] = ma

    2024年02月16日
    浏览(35)
  • 【动态规划】NK刷题记之DP6 连续子数组最大和(C语言实现)

    ❤️博客主页:小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞 勤奋努力是一个长期的过程,如果追求速成,就是异想天开。你越努力、越认真生活,生活就会变得越美丽。如果一直保持奋斗,你的人生将会发生翻天覆地的变化。 🍉 如果你也迷失在了路上,对人

    2024年02月08日
    浏览(38)
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)

    力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出

    2024年02月01日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包