0
点赞
收藏
分享

微信扫一扫

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

​​DP6 连续子数组最大和​​

描述

给定一个长度为 [动态规划]DP6 连续子数组最大和-简单_数组的数组,数组中的数为整数。

请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,子数组最小长度为1。求这个最大值。

输入描述:

第一行为一个正整数 [动态规划]DP6 连续子数组最大和-简单_数组,代表数组的长度。 [动态规划]DP6 连续子数组最大和-简单_动态规划_03

第二行为 [动态规划]DP6 连续子数组最大和-简单_数组个整数 [动态规划]DP6 连续子数组最大和-简单_数组_05,用空格隔开,代表数组中的每一个数。 [动态规划]DP6 连续子数组最大和-简单_动态规划_06

输出描述:

连续子数组的最大之和。

示例1

输入:

8
1 -2 3 10 -4 7 2 -5

输出:

18

说明:

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

示例2

输入:

1
2

输出:

2

示例3

输入:

1
-10

输出:

-10

题解

​假设dp[i][k]表示的是下标i到下标k的数组的和,那么只需要找出这个二维数组中的最大值即可。明显这个思路不是动态规划的解法~~~

假设dp[i]表示到达下标i的最大连续和,则状态转移方程为:

dp[i] = max(dp[i-1] + v[i],v[i]),其中v[i]表示数组下标为i的值

注意:dp[i]并不表示前i个数的和,而是表示前i个数中k个连续数的最大和

代码如下:


#include <bits/stdc++.h>

int max_sum(const std::vector<int> &v)
{
std::vector<int> dp(v.size(), 0);
dp[0] = v[0];

int ans = dp[0];
for (int i = 1; i < dp.size(); ++i)
{
dp[i] = std::max(dp[i - 1] + v[i], v[i]);
ans = std::max(dp[i], ans);
}
return ans;
}

int main()
{
int n, x;
std::vector<int> v;
std::cin >> n;
while (n-- > 0)
{
std::cin >> x;
v.push_back(x);
}

std::cout << max_sum(v) << std::endl;
return 0;
}

举报

相关推荐

0 条评论