依旧是动态规划的问题,给你一个长度为n的数组,求里面子序列的最大和,然后输出这个最大子序列的和,子序列开始的数和子序列结束的数
这道题和1003的那道题的做法很相似,我就是在道题的代码基础上改的,这个要判别一下,整个数组是不是全部为负数,若是,则sum=0
我的想法是最后判定一下它的sum值,若小于0,直接输出0和数组的第一个数和最后一个数
输入
输出6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0
#include<stdio.h>
const int MAX=10010;
int main()
{
int n,a[MAX],x1,x2,x,sum;
while(scanf("%d",&n)&&(n!=0))
{
sum=0;
x1=x2=x=0;
int max=-9999;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(sum<0)
{
sum=0;
x=i;//当sum置0的时候,就把开始的值置为当前的i
}
sum+=a[i];
if(sum>max)
{
max=sum;
x1=x;
x2=i;//记录结束的那个数的下标
}
}
if(max<0)
printf("0 %d %d\n",a[0],a[n-1]);
else
printf("%d %d %d\n",max,a[x1],a[x2]);
}
return 0;
}