http://acm.hdu.edu.cn/showproblem.php?pid=1231
求最长子段和并输出子段的端点,设置数组dp[ i ]表示以i结尾的序列的最大和。那么dp[i] = max( dp[i-1] + a[i], a[i] )。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[10010];
int main()
{
int k,a[10010],f;
while(~scanf("%d",&k) && k)
{
f = 0;
for(int i = 1; i <= k; i++)
{
scanf("%d",&a[i]);
if(a[i] >= 0)
f = 1;
}
if(f == 0)
{
printf("0 %d %d\n",a[1],a[k]);
continue;
}
int maxsum,start = 1,end = 1;//初始化
memset(dp,0,sizeof(dp));
dp[1] = a[1];
maxsum = dp[1];
for(int i = 2; i <= k; i++)
{
if(dp[i-1] < 0)
dp[i] = a[i];
else dp[i] = dp[i-1]+a[i];
if(maxsum < dp[i])
{
maxsum = dp[i];
end = i;
}
}
int s = 0;
for(int i = end; i >= 1; i--)//终点已知,根据最大和倒着找起点
{
s += a[i];
if(s == maxsum)
start = i;
}
printf("%d %d %d\n",maxsum,a[start],a[end]);
}
return 0;
}