DP6 连续子数组最大和
描述
给定一个长度为 的数组,数组中的数为整数。
请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,子数组最小长度为1。求这个最大值。
输入描述:
第一行为一个正整数 ,代表数组的长度。
第二行为 个整数
,用空格隔开,代表数组中的每一个数。
输出描述:
连续子数组的最大之和。
示例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;
}