基础DP。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 10001;
int a[maxn];
int beg, end; //开始,结束
int get_max(int *a, int n) //算法复杂度为O(n)
{
int i, j;
beg = end = 0;
int MaxSum = 0, ThisSum = 0, index = 0;
int cnt = 0, pos = 0;
for(i = 0 ; i < n; i++)
{
ThisSum += a[i];
if(a[i] < 0) cnt++; //记录是否全部为负数
if(ThisSum > MaxSum)
{
beg = pos; //beg标记开始
MaxSum = ThisSum;
end = i; //end记录结束
}
if(ThisSum < 0)
{
ThisSum = 0;
pos = i+1; //记录新的开始
}
}
if(MaxSum == 0) //有多个0,其他的为负数
{
for(i = 0 ; i < n; i++)
{
if(!a[i])
{
index = i;
break;
}
}
beg = end = index;
}
if(cnt == n) //全部为负数的情况
{
MaxSum = 0;
beg = 0;
end = n-1;
}
return MaxSum;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
int i, j;
if(n == 0) break;
memset(a, 0, sizeof(a));
for(i = 0 ; i < n ; i++)
{
scanf("%d", &a[i]);
}
printf("%d ", get_max(a, n));
printf("%d %d\n",a[beg], a[end]);
}
return 0;
#include <stdlib.h>
#include <string.h>
using namespace std;
const int maxn = 10001;
int a[maxn];
int beg, end; //开始,结束
int get_max(int *a, int n) //算法复杂度为O(n)
{
int i, j;
beg = end = 0;
int MaxSum = 0, ThisSum = 0, index = 0;
int cnt = 0, pos = 0;
for(i = 0 ; i < n; i++)
{
ThisSum += a[i];
if(a[i] < 0) cnt++; //记录是否全部为负数
if(ThisSum > MaxSum)
{
beg = pos; //beg标记开始
MaxSum = ThisSum;
end = i; //end记录结束
}
if(ThisSum < 0)
{
ThisSum = 0;
pos = i+1; //记录新的开始
}
}
if(MaxSum == 0) //有多个0,其他的为负数
{
for(i = 0 ; i < n; i++)
{
if(!a[i])
{
index = i;
break;
}
}
beg = end = index;
}
if(cnt == n) //全部为负数的情况
{
MaxSum = 0;
beg = 0;
end = n-1;
}
return MaxSum;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
int i, j;
if(n == 0) break;
memset(a, 0, sizeof(a));
for(i = 0 ; i < n ; i++)
{
scanf("%d", &a[i]);
}
printf("%d ", get_max(a, n));
printf("%d %d\n",a[beg], a[end]);
}
return 0;
}