今天写了一道这道题的升级版 略有感悟 想把这两篇一起写了
http://blog.youkuaiyun.com/xishizuozuo/article/details/53869480
题解 这个题可以理解为枚举长度 只是把一些不必要的枚举省去了
例如 1 2 3 如果是枚举长度 可以有6种答案
第一种1
第二种 2
第三种3
第四种1 2
第五种2 3
第六种1 2 3
这样太过于繁琐 所以可以压缩为
/*if(dp[b-1]>0)dp[b]=dp[b-1]+s1[b];
else dp[b]=s1[b];
*/
#include<stdio.h>
#include<string.h>
int s1[100100];
int dp[100100];
int main()
{
int t,a,n,b,star,end,max;
scanf("%d",&t);
for(a=1;a<=t;a++)
{
if(a!=1)printf("\n");
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(b=0;b<n;b++)
scanf("%d",&s1[b]);
dp[0]=s1[0];
for(b=1;b<n;b++) //寻找前面的x个数相加最大
{
if(dp[b-1]>0)dp[b]=dp[b-1]+s1[b]; //
else dp[b]=s1[b]; //
}
max=dp[0];end=0;
for(b=1;b<n;b++) //下面这步就是简单地往回走求长度
if(dp[b]>max)
{
end=b;
max=dp[b];
}
star=end;
for(b=star-1;b>=0;b--)
{
if(dp[b]>=0)
star=b;
else break;
}
printf("Case %d:\n",a);
printf("%d %d %d\n",max,star+1,end+1);
}
return 0;
}