【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)

简介: 【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)

牛客对应题目链接:连续子数组最大和_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

简单线性 dp。

1、状态表示

dp[i] 表示:以 i 位置为结尾的所有子数组中,最大和是多少。


2、状态转移方程

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


3、返回值

返回 dp 表里的最大值。


二、代码

1、看题解之前AC的代码

#include <iostream>
using namespace std;
 
const int N=2e5+10;
int a[N], dp[N];
 
int main()
{
    int n;
    cin >> n;
    for(int i=0; i<n; i++) cin >> a[i];
    int res=-101;
    for(int i=1; i<=n; i++)
    {
        dp[i]=max(dp[i-1]+a[i-1], a[i-1]);
        res=max(res, dp[i]);
    }
    cout << res << endl;
    return 0;
}

2、值得学习的代码

#include <iostream>
using namespace std;
 
const int N = 2e5 + 10;
 
int n;
int dp[N];
int arr[N];
 
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> arr[i];
 
    int ret = -101;
    for(int i = 1; i <= n; i++)
    {
        dp[i] = max(dp[i - 1], 0) + arr[i];
        ret = max(ret, dp[i]);
    }
 
    cout << ret << endl;
 
    return 0;
}

三、反思与改进

这道题的思路正确,但还是没能通过全部测试样例。这里其实并不需要去判断当前值是正数还是负数,直接与以 i-1 位置为结尾的所有子数组中的最大和进行相加,再和当前值作比较即可。注意,这里需要的是连续子数组的最大和,重点是连续,所以如果前面的值太小就应该舍弃,从当前值开始重新累加。


相关文章
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
102 0
|
人工智能
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
174 0
|
7月前
|
算法 测试技术 C++
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
|
7月前
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
【错题集-编程题】删除相邻数字的最大分数(动态规划 - 线性 dp)
|
7月前
|
存储
【错题集-编程题】合唱团(动态规划 - 线性 dp)
【错题集-编程题】合唱团(动态规划 - 线性 dp)
|
7月前
【错题集-编程题】不相邻取数(动态规划 - 线性 dp)
【错题集-编程题】不相邻取数(动态规划 - 线性 dp)
|
7月前
【错题集-编程题】最长上升子序列(二)(贪心 + 二分)
【错题集-编程题】最长上升子序列(二)(贪心 + 二分)
|
7月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
算法
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II
59 0