算法题——最大(连续)子序列乘积


参考July博客:最大连续子序列乘积

 

先考虑不连续的

思路:一维动态规划

  考虑到乘积子序列中有正有负也还可能有0,可以把问题简化成这样:

  • 数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的情况)。
  • 虽然只要一个最大积,但由于负数的存在,也要记录最小乘积。碰到一个新的负数元素时,最小乘积相乘之后得到最大值。

 

代码:

 1 int maxSuccessiveProduct(int num[], int n)  2 {  3     if(n < 1)  4         return INT_MIN;  5 
 6     int max_prod = num[0], min_prod = num[0];  7     int max_res  = max_prod;  8 
 9     for(int i = 1; i < n; ++i) 10  { 11         int cur_prod1 = max_prod * num[i]; 12         int cur_prod2 = min_prod * num[i]; 13 
14         max_prod = max(max_prod, max(cur_prod1, cur_prod2)); 15         min_prod = min(min_prod, min(cur_prod1, cur_prod2)); 16 
17         max_res  = max(max_prod, min_prod); 18  } 19 
20     return max_res; 21 }

 

再考虑连续的

思路:

和不连续的差不多,不过要同时记录当前子串的最大/最小乘积,如果最大的乘积<当前值,则开始新的子串。

 

代码:

 

 1 int maxProduct(int A[], int n) {  2     int maxEnd = A[0];  3     int minEnd = A[0];  4     int maxResult = A[0];  5 
 6     for (int i = 1; i < n; ++i)  7  {  8         int end1 = maxEnd * A[i], end2 = minEnd * A[i];  9         maxEnd   = max(max(end1, end2), A[i]);  //和上面的不同在于,外层max的另一个参数是当前元素值 10         minEnd   = min(min(end1, end2), A[i]); 11         maxResult = max(maxResult, maxEnd); 12  } 13     return maxResult; 14 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM