如何求最大连续子序列和?
1、如果只有一个数,则便是其本身。
2、有多个数的数组A,如-2,11,-3,13;则最大子序列和为 11-3+13=20.我们知道此序列第二个序列前的最大值为11,前三个的最大和为11-3=8,若利用dp数组存储第i个位置的最大子序列和,则dp[3]=dp[2]+A[3];
由此可得状态转移方程:dp[i]=max(A[i],dp[i-1]+A[i]);
参考代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10010;
bool cmp(int a,int b)
{
return a>b;
}
int A[maxn],dp[maxn]; //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]);//状态转移方程
}
sort(dp,dp+n,cmp);//从大到小排序
printf("%d\n",dp[0]);
return 0;
}
测试用例:
输入:
6
-2 11 -4 13 -5 -2
输出:
20