动规,用dp[i]数组记录到i为止的最大的字段和,v[]数组存这段字段和下标开始的位置,index保存下标结束的位置
状态转移方程:dp[i]=max(dp[i-1]+dp[i],dp[i]); (i>1)
dp[i]=dp[i];(i=1)
记住max()在dp[i-1]+dp[i]==dp[i]时返回dp[i-1]+dp[i]
我是用条件判断做的
#include<stdio.h>
int main()
{
int count=1,i,n,m,index;
int dp[100005],v[100005];
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&dp[i]);
v[i]=i;
}
for(i=2;i<=m;i++)
{
if(dp[i-1]+dp[i]>=dp[i])
{
dp[i]=dp[i-1]+dp[i];
v[i]=v[i-1];
}
}
int max=dp[1];
for(i=1;i<=m;i++)
{
if(dp[i]>=max)
{
max=dp[i];
index=i;
}
}
if(count!=1)
printf("\n");
printf("Case %d:\n%d %d %d\n",count++,max,v[index],index);
}
return 0;
}