最大子序列。DP
#include<stdio.h>
int main()
{
int t,k,n = 0,cnt[100010],start,end,position,summax,thismax;
scanf("%d",&t);
while(t--)
{
n++;
scanf("%d",&k);
for(int i = 1 ; i <= k ; i++)
{
scanf("%d",&cnt[i]); //输入数据
}
position = start = end = 1;
summax = thismax = cnt[1]; //将当前的最大值thismax和最终转台最大值sunmax初始化为第一个数据。
for(int i = 2 ; i <= k ; i++)
{
if(thismax + cnt[i] < cnt[i]) //前一状态thismax小于0,则子序列从下一个数据开始。
{
thismax = cnt[i];
position = i;
}
else
{
thismax += cnt[i];
}
if(thismax > summax)//保证summax为最大
{
summax = thismax;
end = i;
start = position;
}
}
printf("Case %d:\n%d %d %d\n",n,summax,start,end);
if(t)
{
putchar(10);
}
}
return 0;
}