longessumSubArray DP

/*
Copyright personal all reversed
Author   Steven
Date   2011-06-28
description:
            input :
          number array(positive and negative) in any sequence.
   output
          the sum of the longest subArray which the sequence  must be continue .

Algorithm description:
                     use the thought of the recursion(准确说是分治). The longest sequence must in only left part or in right side
      or both side.
                     if we use non-algorithm. we may enum all the possibilities. Enum the start point and the end point Cn2 = n*(n-1) +n
                     Calculate the result need n. we need O(n3)
      分治每次可以二分,复杂度降低到logn 计算复杂度还是N 故总体复杂度n*logn
*/
#include <stdio.h>
#include <stdlib.h>
//[a,b)
int  RecursionSum(int* pArray,int start,int end)
{
 int sum = 0;                         
 if(end - start == 1)                                           // single point can return directly

  return pArray[start];
 int middleNum = (end + start)/2;                             // calculate the middle point
  int left   = RecursionSum(pArray, start, middleNum) ;      // longest subArray in left part
 int right  = RecursionSum(pArray, middleNum, end);
 if(left > right)
  sum = left;
    else
  sum = right;
 int leftSum = pArray[middleNum-1];
 int tempSum = 0;
 //================ longest subArray is  both in left part and right part==========================//
 //left side
 for(int index = middleNum-1; index >= start; index--)
 {
  tempSum = tempSum + pArray[index];
  
  if(leftSum <= tempSum)
  {
   leftSum = tempSum;
  }
 }
 int righttSum = pArray[middleNum];
 tempSum = 0;
 // right side
 for(index = middleNum; index < end;index++)
 {
  tempSum = tempSum + pArray[index];
  if(righttSum <= tempSum)
  {
   righttSum = tempSum;
  }
 }
 
    int LrSum = leftSum + righttSum;
 if(LrSum  >  sum)
 {
  return LrSum;
 }
 else
  return sum;
}
// 动态规划求解。时间复杂度O(n) 求状态的时候算法是O(n),枚举状态算法是O(n)
int DynamicRecursion(int* pArray,int size,int ranges)
{
    int longestSubArray[10];
 for(int j=0;j<size;j++) longestSubArray[j]=-1;
 int sum =0;
 for(int index=1;index<ranges;index++)
    {
        if(longestSubArray[index-1]==-1)// not be stored
  {
   // calculate and store
            int subSum = 0;
   int tempSum =0;
   for(int i=index;i>=1;i--)
   {
               tempSum = tempSum + pArray[i];
      if(subSum < tempSum)
      {
       subSum = tempSum;
      }
   }
   // store
   longestSubArray[index] = subSum;

  }
  else
  {
   // how to write this code?
   if(longestSubArray[index-1]<0)
   {
    longestSubArray[index] = pArray[index];
   }
   else
              longestSubArray[index] = longestSubArray[index-1] + pArray[index];
  }
  
 }
 int sum2 =0;
 for(int i=0;i<ranges;i++)
 {
     if(sum2 < longestSubArray[i])
   sum2 = longestSubArray[i];
 }
 return sum2;
}
int main()
{
 int nArray[11]={0,1,2,3,-100,5,6,7,8,9};
 int sum = RecursionSum(nArray,0,10);
 int sum2 = DynamicRecursion(nArray,10,10);
 printf("%d",sum2);
 system("pause");
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值