解题报告:在求一个数列的子序列的最大和时,我们需要从第一个非负数开始(temp),逐渐加上后面的数存在sum中,如果sum也为负数,则就再次从下一个非负数开始累加。每次得到的和与max比较,用max记录最大和。据说这用到了DP的思想。。。
#include<cstdio>
int main(){
int t,n,cnt=1;
scanf("%d",&t);
while(t--){
int a,max;//子序列最大和
int temp;//暂存初始位置
int sum;//从temp开始到n的序列和
int start,end;//记录初末位置
max=-1000;temp=1;sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
sum+=a;
if(sum>max){//如果sum大于max,更新相应的值
max=sum;
start=temp;
end=i;
}
if(sum<0){
sum=0;//如果前面的数相加的和是负的,则sum清零,从下一个数开始
temp=i+1;
}
}
printf("Case %d:\n%d %d %d\n",cnt++,max,start,end);
if(t!=0)
printf("\n");
}
return 0;
}
3099

被折叠的 条评论
为什么被折叠?



