这题通过率低的可怕。。。确实有几个坑。
1、首先题目要求输出的是最大子序列的首元素和尾元素,而不是下标。给的测试样例正好是元素也是下标,容易被误解(我就看错了)。
2、题目中没有说数字有没有0,所以要考虑进去;我写的程序里面,把0当做正数来处理,比较方便。
#include <iostream>
#include <stdio.h>
using namespace std;
int N;
int *p;
int maxsum = -1;
int mini = 100000,minj = 100000;
int main()
{
scanf("%d",&N);
p = new int[N+1];
int positive = -1;
for(int i = 0;i<N;i++)
{
scanf("%d",&p[i]);
if(p[i] >=0)
{
positive = i;
}
}
if(positive == -1)
{
printf("0 %d %d",p[0],p[N-1]);
return 0;
}
int a = 0,b = 0;
int i = 0,j = 0;
int temp_sum = 0;
for(;a<=positive;a++)
{
if(p[a] <0)
{
continue;
}
for(b = a;b<=positive;b++)
{
temp_sum+=p[b];
if(temp_sum>maxsum)
{
maxsum = temp_sum;
i = a;
if(i<mini)
{
mini = i;
}
j = b;
if(j<minj)
{
minj = j;
}
}
}
temp_sum = 0;
}
printf("%d %d %d",maxsum,p[i],p[j]);
return 0;
}
思路就是,在输入的时候,定义一个变量,保存最后一个正数的位置positive,循环遍历的时候到这个位置就不需要往后继续看了,因为后面都是负数,越加越小。
定义两个变量a,b当指针用,指向子序列的首尾位置。指针a指向的第一个数一定是正数(或0),不可能是负数;然后第二个指针b就从a的位置往后找,每经过一个数就计算一下和。
测试用例里面,有和为0的,比较坑,所以全局变量maxsum定义成-1,不然出错。
(这个题最快的方法是动态规划,第一次做的时候没想到。。后来试了一下别人的dp算法果然快)