题目
给定K个整数的序列{ A1, A2, …, Ak },其任意连续子序列可表示为{ Ai, Ai+1, …, Aj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个。
例如给定序列{ -2, 11, -4, 13, -5, -2 },
其最大连续子序列为{ 11, -4, 13 },最大和为20。
动态规划:
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 10010
int A[N], dp[N];//A[i]存放序列,dp[i]存放一A[i]结尾的连续序列的最大和
int main(){
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++){//读入序列
scanf("%d", &A[i]);
}
//边界
dp[0] = A[0];
for(int i = 1; i < n; i++){
//状态转移方程
dp[i] = max(A[i],dp[i-1] + A[i]);
}
//dp[i]存放一A[i]结尾的连续序列的最大和,遍历dp[n]找到最大值
int k = 0;
for(int i =1; i < n; i++){
if(dp[i] > dp[k]){
k = i;
}
}
printf("%d",dp[k]);
return 0;
}
输入数据:
6
-2 11 -4 13 -5 -2
输出结果:
20