题目:http://acm.hdu.edu.cn/showproblem.php?pid=1003
Max Sum
经典DP,记录首和尾,注意全负的情况就行了。
#include <stdio.h>
#include <string.h>
int dp[3][100010];
int max,maxt;
int main()
{
int cas;
int n;
scanf("%d",&cas);
for(int p=1;p<=cas;p++)
{
printf("Case %d:\n",p);
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&dp[0][i]);
maxt=1;
max=dp[1][1]=dp[0][1];
dp[2][1]=1;
for(int i=2;i<=n;i++)
{
if(dp[1][i-1] >= 0)
{
dp[1][i]=dp[0][i]+dp[1][i-1];
dp[2][i]=dp[2][i-1];
}
else
{
dp[1][i]=dp[0][i];
dp[2][i]=i;
}
if(max<=dp[1][i])
{
max=dp[1][i];
maxt=i;
}
}
printf("%d %d %d\n",max,dp[2][maxt],maxt);
if(p!=cas)
printf("\n");
}
return 0;
}