题目:给定一个数字序列A1,A2…An,求i,j(1<=i<=j<=n),使得Ai+…+Aj最大,输出这个最大和。
例:
输入:
6
-2 11 -4 13 -5 -2
输出:
20
分析:这是一道经典的动态规划问题,用dp[j]表示以Aj作为结尾的最大连续子序列的和;dp[j] = max(dp[j-1], 0) + Aj;
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n, ret;
int dp[10010], a[10010];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
dp[0] = a[0];
ret = a[0];
for (int i = 1; i < n; i++) {
dp[i] = max(dp[i - 1], 0) + a[i];
if (dp[i] > ret)
ret = dp[i];
}
printf("%d", ret);
return 0;
}