poj2479,poj 2593 动归

来源:互联网 发布:笔记本thinkpad和mac 编辑:程序博客网 时间:2024/04/29 23:25

 

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

 

   

0 0