动态规划第三节课
文章目录
1.3 求最大子段和
给出一个长度为n的序列a,选出其中连续且非空的一段使得这段和最大。
如果均为负数,则输出0。
算法1:暴力
我们可以暴力枚举左端点和右端点,前缀和直接求最大值,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
算法2:dp
d p i dp_i dpi: 以i结尾的最大子段和
递推公式: d p i = max ( d p i − 1 + a i , a i ) dp_i=\max(dp_{i-1}+a_i,\space a_i) dpi=max(dpi−1+ai, ai)
好了,上代码!
#include <iostream>
#include <cstdio>
using namespace std;
int dp[1000010];
int a[1000100];
int main()
{
int n;
scanf("%d", &n);
dp[0] = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
dp[i] = max(dp[i - 1] + a[i], a[i]);
}
int mx = 0;
for(int i = 1; i <= n; i ++)
{
mx = max(mx, dp[i]);
}
printf("%d\n", mx);
return 0;
}