hdu 1003,hdu 1231 最长连续和

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003
#include <iostream>
#include<fstream>
#include<string>
using namespace std;


int main()
{


     //ifstream cin("testdata.txt");
     int n=0;
     cin>>n;
     for(int l=0;l<n;l++)
     {
        int size=0;
           cin>>size;
         int *p=new int[size];
          for(int i=0;i<size;i++)
              cin>>p[i];


         int begin=0;
         int end=0;
         int sum=0;
         int maxsum=p[0];
         int maxbegin=0;
         int maxend=0;
          for(int i=0;i<size;i++)
            {
               sum+=p[i];


               if(sum>maxsum)


                 {
                    maxbegin=begin;
                    maxend=i;
                    maxsum=sum;


                 }


                if(sum<0)
                {
                   begin=i+1;
                   sum=0;
                 }




             }


          cout<<"Case "<<l+1<<":"<<endl;
          cout<<maxsum<<" "<<maxbegin+1<<" "<<maxend+1<<endl;


         if(l<n-1) cout<<endl;




     }
}

上面是很久以前做的了,hdu 1231 是同一个题: http://acm.hdu.edu.cn/showproblem.php?pid=1231

题目地址:

有一个新的思路,考察a[j] 作为结尾的最长连续和实际上是求s[i]  (i<=j-1) 的最小值,然后这个最小值是“当前最小值”,可以直接把当前要考虑的数和之前找到的最小数进行比较

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;


int sum[10005];
int a[10005];
int start[10005];
int main()
{
   int n;
   while(cin>>n)
   {
     if(n==0)  break;
     memset(sum,0,sizeof(sum));
     memset(start,0,sizeof(start));

     int temp;


      for(int i=0;i<n;i++)
      {
         scanf("%d",&a[i+1]);

         sum[i+1]=sum[i]+a[i+1];


      }

    int curmin=2147483647;
    int minindex=0;
      for(int i=1;i<=n;i++)
      {
         if(sum[i-1]<curmin)
          {
             curmin=sum[i-1];
             minindex=i-1;
             start[i]=minindex;
          }

          else
          {
             start[i]=minindex;
          }
      }
          int begin=0;
          int end=0;

          int max=-2147483647;
          for(int i=1;i<=n;i++)
          {
              if(sum[i]-sum[start[i]]>max)
              {
                  max=sum[i]-sum[start[i]];

                  begin=start[i];
                  end =i;
              }
          }
        if(max>=0)
         cout<<max<<" "<<a[begin+1]<<" "<<a[end]<<endl;

        else
        cout<<0<<" "<<a[1]<<" "<<a[n]<<endl;


   }
}


原文地址:https://www.cnblogs.com/814jingqi/p/3310439.html