题目:http://acm.hdu.edu.cn/showproblem.php?pid=1231
最大连续子序列
经典DP,从头到尾扫一遍,注意记录首和尾的值。
经验:做这类题尤其要注意全负的情况,还有记得首尾有个小TRICK记得处理。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define clr(arr,val) memset(arr,val,sizeof(arr))
struct number
{
int num;
int sum;
int st;
}num[10010];
int k;
int main()
{
while(scanf("%d",&k) != EOF && k)
{
clr(num,0);
for(int i=1; i<=k; i++)
{
scanf("%d",&num[i].num);
num[i].st = num[i].num;
num[i].sum = num[i].num;
}
int maxsum = num[1].num;
int tag = 1;
for(int i=2; i<=k; i++)
{
if(num[i-1].sum > 0)
{
num[i].sum = num[i-1].sum + num[i].num;
num[i].st = num[i-1].st;
}
if(num[i].sum > maxsum)
{
maxsum = num[i].sum;
tag = i;
}
}
if(maxsum < 0)
printf("0 %d %d\n",num[1].num,num[k].num);
else
printf("%d %d %d\n",maxsum,num[tag].st,num[tag].num);
}
return 0;
}