最大子序列问题

#include <iostream>
#include <ctime>
using namespace std;

/*************************
**   求数组list从begin到end中和最大的子序列 
**   参数:
           list : 要求的数组
           begin : 数组的起始位置
           end : 数组的结束位置
           sbegin : 最大子序列的起始位置(作为返回值)
           send : 最大子序列的结束位置(作为返回值)
**   返回值:
           最大子序列的和  
*/
long BigestSequence(int *list , size_t begin , size_t end , size_t &sbegin , size_t &send)
{
     long max = 0;
     long sum = 0;
     sbegin = send = 0;
     size_t pos = 0;
     for(size_t i = begin ; i <= end ; ++i)
     {
                sum += list[i];
                if(max <= sum) 
                {
                       max = sum;
                       sbegin = pos;
                       send = i;
                }
                if(sum < 0) 
                {
                       sum = 0;
                       pos = i+1;
                }
                
     }
     return max;
}


int main()
{
   int *list;
   int len;
   cin>>len;  //输入数组长度 
   list = new int[len];
   srand(time(0));
   
   //随机生成数组值,值在[-len^2,len^2之间] 
   for(size_t i = 0 ; i != len ; ++i)
   {
              list[i] = (rand()%2?1:-1) * (rand()%(len*len));
              cout<<list[i]<<" ";
   }
   cout<<endl;
   
   size_t start , end;         //记录得到的最大子序列的起始和结束位置 
   cout<<BigestSequence(list,0,len-1,start,end)<<endl<<start<<" "<<end<<endl;;
   
   system("pause");
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值