入门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;
}
如果说年轻人未来是一场盛宴的话,那么我首先要有赴宴的资格。