PKU 2479 Maximum sum
http://acm.pku.edu.cn/JudgeOnline/problem?id=2479
又一晚上讨论题
关键求两个最大连续子序列
我设计的算法: 前后各算出 求解最大和:
M |
| 9 | 9 | 9 | 7 | 5 | 5 | 5 | 5 | 5 | -5 |
右 |
| 9 | 8 | 9 | 7 | 5 | 2 | 5 | 1 | 5 | -5 |
原 |
| 1 | -1 | 2 | 2 | 3 | -3 | 4 | -4 | 5 | -5 |
左 |
| 1 | 0 | 2 | 4 | 7 | 4 | 8 | 4 | 9 | 4 |
M |
| 1 | 1 | 2 | 4 | 7 | 7 | 8 | 8 | 9 | 9 |
CODE:
#include <iostream>
using namespace std;
int a[50005];
int lmax[50005];
int rmax[50005];
int main()
{
int i,j,k,n,m,t;
while (scanf("%d",&t)!=EOF)
{
while (t--)
{
scanf("%d",&n);
int sum = 0;
int maxsum =0;
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum += a[i];
if (sum > maxsum)
{
maxsum = sum;
}
if (sum < 0)
{
rmax[i] = a[i];
sum = 0;
}
else
{
rmax[i] = maxsum;
}
}
sum = 0; maxsum =0;
for (i=n-1;i>=0;i--)
{
sum = 0;
sum += a[i];
if (sum > maxsum)
{
maxsum = sum;
}
if (sum < 0)
{
lmax[i] = a[i];
sum = 0;
}
else
{
lmax[i] = maxsum;
}
}
//打完表
//---------------------------------------
//做数据比较处理:
maxsum = 0;
for (i=0;i<n-1;i++)
{
if (rmax[i]+lmax[i+1] > maxsum)
{
maxsum = rmax[i] + lmax[i+1];
}
}
printf("%d/n",maxsum);
}
}
return 0;
}