最大子段和是一个学习动态规划必学的问题,也是最基础的动态规划问题。
洛谷1115 最大子段和
题目描述:
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行:是一个正整数N,表示了序列的长度。
第二行:包含N个整数num[i],描述了这段序列。
输出格式:
一个整数,为最大的子段和是多少。
输入样例:
7
2 -4 3 -1 2 -4 3
输出样例:
4
对于最大子段和这个问题,其实我们发现如果说序列中所有的数都是正数,那么最大子段和一定是所有数的和,但为什么有时候不是呢?这就是负数捣的鬼。那么怎么解决负数呢?这就要用到动态规划了,提到DP,就一定就要去想:状态、转移方程、初值和答案了。
最后算一下算法时间复杂度:只有一层循环,所以时间复杂度就是O(n)级别的了。
# include <cstdio>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;
const int N_MAX = 200000;
int n;
int a[N_MAX + 10];
int dp[N_MAX + 10];
int maxSum()
{
int ans = -2e9;
for (int i = 1; i <= n; i++) {
dp[i] = max(dp[i - 1], 0) + a[i];
ans = max(ans, dp[i]);
}
return ans;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
printf("%d\n", maxSum());
return 0;
}
原文:https://www.cnblogs.com/000zwx000/p/12467968.html