第28章:最大连续乘积子串

-2.5 4 0 3 0.5 8 -1Ans:(3,0.5,8)

template<typenameComparable>

Comparable maxprod(constvector<Comparable>& v)

{

 int i;

 Comparable maxProduct =1;

 Comparable minProduct =1;

 Comparable maxCurrent = 1;

 Comparable minCurrent =1;

 

 for(inti=0;i<v.size();i++)

 {

  maxCurrent *= v[i];

  minCurrent *= v[i];

  if(maxCurrent >maxProduct)

   maxProduct =maxCurrent;

  if(minCurrent >maxProduct)

   maxProduct =minCurrent;

  if(maxCurrent <minProduct)

   minProduct =maxCurrent;

  if(minCurrent <minProduct)

   minProduce =minCurrent;

  if(minCurrent >maxCurrent)

  Swap(maxCurrent,minCurrent);

  if(maxCurrent < 1)

   maxCurrent = 1;

  return maxProduct;

 }

}

 

 

*直接用动态规划求解

状态转移方程:max表示以a结尾的最大连续子串

Max = max{a,Max[i-1]*a,Min[i-1]*a};

Min =min{a,Max[i-1]*a,Min[i-1]*a};

 

C++代码:

double func(double* a ,constint n)

{

 double* maxA = newdouble[n];

 double* minA = newdouble[n];

 msxA[0] = min[A] = a[0];

 double value = maxA[0];

 for(int i=1;i<n;i++)

 {

  maxA[i] =max(max(a[i],maxA[i-1]*a[i]),minA[i-1]*a[i]);

  minA[i] =min(,min(a[i],maxA[i-1]*a[i]),minA[i-1]*a[i]);

  vlaue =max(value,maxA[i]);

 }

 delete [] maxA;

 delete [] minA;

 return value;

}

转载于:https://www.cnblogs.com/lsx1993/p/4841552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值