最大子段和:给定一个序列(元素可正可负),找出其子序列中元素和最大的值。
我们用dp(i)表示序列中以元素ans(i)结尾的序列的最大子段和,那么有:dp(i)=max(dp(i-1)+ans(i),ans(i));
#define INF 999999999
int solve(int ans[],int n)
{
dp[0]=0;
int nmax=-INF;
for(int i=1;i<=n;i++)
{
dp[i]=max(dp[i-1]+ans[i],ans[i]);
nmax=max(nmax,dp[i]);
}
return nmax;
}
首先来看一道比较基础的最大子段和问题--HDU1003 Max Sum:
题目大意:给定一个序列,让求出此序列的最大子段和,并输出该子序列在原序列中的位置。
这里我们用变量sum来代替dp()数组,如果sum+a(i)<a(i),就更新sum的值,并重新纪录head的值,如果sum+a(i)>=a(i),则只需更新sum的值;