算法:1.一直相加直到和出现负数,在相加期间能得到一个最大和,记录
2.重复1步骤,更新最大和,直到输入完毕
原理:如果在连续子串 <a1,a2,a3,...,an> 中Sn<0;S1,S2,...S(n-1)均大于或等于0
那么肯定存在一个最大的Si,Si也就是a1到an这段连续子串的最大和。
我们知道a1>0时任意的 <ai...an> (i>1) 的和都小于0,
所以这些元素就不能与an后的元素构成能获得最大和的子串(如果a1=0则a2>=0,情况类似);
同时在 <ai...aj> (i>1,j<=n) 也不能或得比Si大的和。
/*
HDU1003
动态规划
*/
#include<stdio.h>
#define MAXN 100000
int main()
{
int T,iCase,i,sum,maxsum,j,x,y,a;
int n;
scanf("%d",&T);
iCase=0;
while(T--)
{
iCase++;
sum=0;
maxsum=-20000;
i=1;
scanf("%d",&n);
for(j=1;j<=n;j++)
{
scanf("%d",&a);
sum+=a;
if(maxsum<sum)
{
maxsum=sum;
x=i;
y=j;
}
if(sum<0)
{
i=j+1;
sum=0;
}
}
printf("Case %d:\n",iCase);
printf("%d %d %d\n",maxsum,x,y);
if(T>0)printf("\n");
}
return 0;
}
2.重复1步骤,更新最大和,直到输入完毕
原理:如果在连续子串 <a1,a2,a3,...,an> 中Sn<0;S1,S2,...S(n-1)均大于或等于0
那么肯定存在一个最大的Si,Si也就是a1到an这段连续子串的最大和。
我们知道a1>0时任意的 <ai...an> (i>1) 的和都小于0,
所以这些元素就不能与an后的元素构成能获得最大和的子串(如果a1=0则a2>=0,情况类似);
同时在 <ai...aj> (i>1,j<=n) 也不能或得比Si大的和。
/*
HDU1003
动态规划
*/
#include<stdio.h>
#define MAXN 100000
int main()
{
int T,iCase,i,sum,maxsum,j,x,y,a;
int n;
scanf("%d",&T);
iCase=0;
while(T--)
{
iCase++;
sum=0;
maxsum=-20000;
i=1;
scanf("%d",&n);
for(j=1;j<=n;j++)
{
scanf("%d",&a);
sum+=a;
if(maxsum<sum)
{
maxsum=sum;
x=i;
y=j;
}
if(sum<0)
{
i=j+1;
sum=0;
}
}
printf("Case %d:\n",iCase);
printf("%d %d %d\n",maxsum,x,y);
if(T>0)printf("\n");
}
return 0;
}