动态规划——最大子数组和

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

问题描述:

最大子数组和
Time Limit: 1000 MS Memory Limit: 5000 KB

Description

给定一个长度为N的int型数组a[0,1,2,...N-1], 请计算最大子数组和.

Input

第一行输入M表示包含M组测试数据,每组先输入N (N<=50000), 接着输入N个int型整数.

Output

输出最大子数组和.

Sample Input

2
5 -1 -5 -2 -1 -3
5 2 -1 3 -2 4

Sample Output

-1
6

问题分析:

显然该题应使用动态规划的方法求解。

可以使用动态规划来求解最大子数组和。假设dp[i]表示以第i个元素结尾的最大子数组和,那么可以得到以下状态转移方程:

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

其中a[i]表示第i个元素的值。初始状态为dp[0] = a[0]。最终的答案即为dp[i]中的最大值。

时间复杂度为O(N)。文章来源地址https://www.toymoban.com/news/detail-433544.html

代码示例:

#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 50005;

int a[MAXN];
int dp[MAXN];   // dp[i]表示以第i个元素结尾的最大子数组和

int main() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        dp[0] = a[0];
        int ans = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = max(dp[i-1]+a[i], a[i]);//整篇代码的核心,
            ans = max(ans, dp[i]);
        }
        cout << ans << endl;
    }
    return 0;
}

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

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

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

相关文章

  • 【学会动态规划】最大子数组和(19)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:53. 最大子数组和 - 力扣(L

    2024年02月12日
    浏览(30)
  • 动态规划——最大子数组和(Leetcode 53)

    解题代码: ===== int maxSubArray(int* nums, int numsSize){ int pre = 0, maxAns = nums[0]; 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训

    2024年04月26日
    浏览(29)
  • 动态规划:918. 环形子数组的最大和

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》《算法》 本篇文章仅是作为小白的我的一些理解,,如果有错误的地方,希望大佬们指出。 918. 环形子数组的最大和 求环型数组中连续子数组最大和。 关于子数组的最大和,其有两种情况。 对于情况1而言,

    2024年02月08日
    浏览(29)
  • leetcode410. 分割数组的最大值 动态规划

    hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m , 你需要将这个数组分成 m 个非空的连续子数组 。 设计一个算法使得这 m 个子数组各自和 的 最大值最小 。 令 dp[i][j]表示将数组的 前 i 个数分割为 j 组 所能得到的最大连续子数组和的最

    2024年02月13日
    浏览(24)
  • 【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月03日
    浏览(40)
  • 53.最大子数组和(前缀和、动态规划,C解法)

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 示例 2: 示例 3: 分析:         前缀和数组可以在单位时间内得到 [ l , r ] 区间和,但本题所求子数组中 l 、 r 以

    2024年01月22日
    浏览(39)
  • 题解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)
  • 【算法|动态规划No.12】leetcode152. 乘积最大子数组

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年02月08日
    浏览(34)
  • 算法导论-分而治之-最大子数组(含动态规划解法)

    分治法 把一个问题分成(同类的)几个子问题。 递归地解决(征服)每个子问题。 将子问题的解决方案组合成整体解决方案。 通常的使用 将大小为n的问题分成两个大小为n / 2的子问题。 递归求解(攻克)两个子问题。 将两个方案组合成整体方案。 当子问题足够大以进行递归求解

    2024年02月03日
    浏览(33)
  • 力扣 53. 最大子数组和(C语言+分治递归、动态规划)

            给你一个整数数组  nums  ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组  是数组中的一个连续部分。         示例 1:         示例 2:         示例 3: (1)分治递归         分治法的核心部分。

    2024年02月07日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包