问题描述:
给定一个数字序列A1,A2,...An,求i,j(1<=i<=j<=n),使Ai+...Aj最大,输出这个最大和。
设置一个数组dp[i]表示以A【i]作为末尾的连续序列的最大和,如果有n个数字,那么最大的字段和是dp[0],dp[1],...dp[n-1]中的最大值,现在求解dp数组。
因为dp[i]是以A[i]为结尾的连续序列,有以下两种情况,
1,序列中有一个元素,就是A[i[自己,最大字段和是A[i];
2,序列中有多个元素,以下标p开始,到A[i]结束,最大字段和dp[i-1]+A[i];
得到状态转移方程是
dp[i]=max{A[i],dp[i-1]+A[i]}
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010;
int A[maxn], dp[maxn];
int main() {
int n;
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
}
dp[0] = 0;
for (int i = 1; i < n; i++)
dp[i] = max(A[i], dp[i - 1] + A[i]);
int k = 0;
for (int i = 1; i < n; i++) {
if (dp[i] > dp[k])
k = i;
}
printf("%d\n", dp[k]);
return 0;
}