[动态规划]BM72 连续子数组的最大和-简单

juneyale

关注

阅读 61

2022-06-20

​​BM72 连续子数组的最大和​​

知识点​​动态规划​​​​贪心​​

描述

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。数据范围:[动态规划]BM72 连续子数组的最大和-简单_求和

[动态规划]BM72 连续子数组的最大和-简单_动态规划_02


要求:时间复杂度为 [动态规划]BM72 连续子数组的最大和-简单_求和_03,空间复杂度为 [动态规划]BM72 连续子数组的最大和-简单_求和_03进阶:时间复杂度为 [动态规划]BM72 连续子数组的最大和-简单_求和_03,空间复杂度为 [动态规划]BM72 连续子数组的最大和-简单_求和_06

示例1

输入:

[1,-2,3,10,-4,7,2,-5]

复制返回值:

18

复制说明:

经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18

示例2

输入:

[2]

复制返回值:

2

复制

示例3

输入:

[-10]

复制返回值:

-10

题解

动态规划

  • 用dp数组表示以下标[动态规划]BM72 连续子数组的最大和-简单_动态规划_07为终点的最大连续子数组和
  • 初始条件:dp[0] = array[0]
  • 状态转移方程:dp[i] = array[i-1] > 0 ​? (dp[i-1] + array[i]) : (array[i])
  • 返回值:使用max_sum存放dp[i]中的最大值​

注意:

  • 时间复杂度:o(n)
  • 空间复杂度:o(n),由于dp[i]只依赖于dp[i-1],因此可以将空间复杂度优化到o(1)
#include <bits/stdc++.h>

int FindGreatestSumOfSubArray(std::vector<int> array)
{
if (array.size() == 0)
{
return 0;
}
std::vector<int> dp(array.size(), 0);
dp[0] = array[0];
int max_sum = dp[0];
for (int i = 1; i < array.size(); ++i)
{
if (dp[i - 1] < 0)
{
dp[i] = array[i];
}
else
{
dp[i] = dp[i - 1] + array[i];
}
max_sum = std::max(max_sum, dp[i]);
}
return max_sum;
}

方法二:贪心解法


精彩评论(0)

0 0 举报