复旦19考研机试真题(2)--最大连续子序列

题目:给定一个数字序列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  
#include
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;
}

你可能感兴趣的:(考研复试真题)