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;
}

本文详细解释了解决POJ在线编程竞赛中两个关于求解数组中连续子数组最大和的问题。通过分析问题特点,提出了一种有效的算法策略,包括在输入同时记录最大和、使用两个数组分别记录前向和后向最大和等技巧。该方法不仅解决了具体问题,还展示了如何灵活应用数据结构和算法解决类似的编程挑战。
1194

被折叠的 条评论
为什么被折叠?



