入门DP--最大子段和

题目:

N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。
当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。

题目链接:

https://www.51nod.com/Challenge/Problem.html#problemId=1049

侃侃:

我们发现下一项是否要加和前一项有关,如果说加上当前这一项相对于当前项较大,
说明可以加上反之不可加,即当前的最大值就是当前值(新的一个开始)。
dp[i]: 以 i 结尾的最大连续字段和
dp[i] = max(dp[i - 1] + a[i],a[i])。
由于我们求的都是某一段,并不知道哪一段是最大的,所以最后遍历取最大值即可。

Code:

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

#define INF 0x3f3f3f3f

using namespace std;

const int maxn = 5e4 + 10;

long long dp[maxn];

long long a[maxn];

int n;

int main(void) {
	cin >> n;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	// dp[i]:以 i 结尾的最大连续子段和 
	for(int i = 1; i <= n; i ++) {
		dp[i] = max(dp[i - 1] + a[i],a[i]);
	}
	// 因为有负数,所以取 负无穷大 
	long long maxValue = -INF;
	for(int i = 1; i <= n; i ++) {
		maxValue = max(dp[i],maxValue);
	}
	cout << maxValue << endl;
	return 0;
}
posted @ 2020-05-04 20:19  IceSwords  阅读(237)  评论(0编辑  收藏  举报