poj 2479
如题:http://poj.org/problem?id=2479
题目很简单 就不翻译了 大概说是求一个数组中2段最大的和
这个题目数据量是50000,但时间只有1000ms
在输入的同时 将之前可能出现的最大连续求出,保存在另一个数组,然后在从后向前遍历一次,求出从后向前连续可能出现最大和,后向前遍历的同时,和前面求出数组中的和相加,匹配,寻找最终的结果。
注意两点:1.输入数 组中每个数据时用scanf 不然可能超时
2.ans初始化要为MIN
#include<iostream>
using namespace std;
#define MIN -999999999
int num[50001];
int count[50001];
int main()
{
int ans;
int N;
cin>>N;
int max,sum,n,i;
while(N--)
{
ans=MIN;
max=MIN;
sum=0;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
if(sum>max)
max=sum;
count[i]=max;
if(sum<0)
sum=0;
}
max=MIN;
sum=0;
for(i=n;i>1;i--)
{
sum+=num[i];
if(sum>max)
max=sum;
if(ans<max+count[i-1])
ans=max+count[i-1];
if(sum<0)
sum=0;
}
cout<<ans<<endl;
}
return 0;
}
poj 2593
http://poj.org/problem?id=2593
题目和2479一样 只是时间要求相对宽松
#include<iostream>
using namespace std;
#define MIN -999999999
#define MAXN 100002
int num[MAXN];
int count[MAXN];
int main()
{
int N,i,sum,max,ans;
while(1)
{
sum=0;
max=MIN;
cin>>N;
if(N==0) break;
for(i=1;i<=N;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
if(sum>max)
max=sum;
count[i]=max;
if(sum<0)
sum=0;
}
max=MIN;
sum=0;
ans=MIN;
for(i=N;i>1;i--)
{
sum+=num[i];
if(sum>max)
max=sum;
if(ans<max+count[i-1])
ans=max+count[i-1];
if(sum<0)
sum=0;
}
cout<<ans<<endl;
}
return 0;
}