动态规划方法求最大子连续数组乘积
2016-09-27 16:38
357 查看
假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max来表示以a结尾的最大连续子串的乘积值,用Min表示以a结尾的最小的子串的乘积值,那么状态转移方程为:
Max=max{a, Max[i-1]*a, Min[i-1]*a};
Min=min{a, Max[i-1]*a, Min[i-1]*a};
初始状态为Max[1]=Min[1]=a[1]。
代码很简单:
此外,此题还有另外的一个变种形式,即给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。
实现方法就是空间换时间,定义三个数据p[], s[], t[], 其中s[i]中存储数组前i个元素的乘积, t[i]存储后N-i个元素的乘积,则可得p[i]=s[i-1]*t[i+1];
Max=max{a, Max[i-1]*a, Min[i-1]*a};
Min=min{a, Max[i-1]*a, Min[i-1]*a};
初始状态为Max[1]=Min[1]=a[1]。
代码很简单:
double func(double *a,const int n) { double *maxA = new double ; double *minA = new double ; maxA[0] = minA[0] =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]* 4000 a[i]); minA[i] = min(min(a[i],maxA[i-1]*a[i]),minA[i-1]*a[i]); value=max(value,maxA[i]); } return value; }
此外,此题还有另外的一个变种形式,即给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。
实现方法就是空间换时间,定义三个数据p[], s[], t[], 其中s[i]中存储数组前i个元素的乘积, t[i]存储后N-i个元素的乘积,则可得p[i]=s[i-1]*t[i+1];
相关文章推荐
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
- 动态规划典型例题--连续子数组的最大和
- 动态规划:求子数组的最大连续和
- 动态规划题目(三)——最大连续乘积子串
- 【面试常见题目之动态规划】连续子序列的最大和(子数组的最大和)
- 利用动态规划求连续数组最大和以及最大子矩阵的和
- 利用动态规划求连续数组最大和以及最大子矩阵的和
- 动态规划求取连续数组最大和
- 动态规划-最大连续乘积子数组
- 【面试题】连续子数组乘积最大值与柱状图中找最大矩形
- uva108 Maximum Sum--数组动态规划的题的方法!!
- 动态规划求数组中和最大字串的值 以及 字符串的循环移位(要求空间复杂度O(1),时间复杂度O(n))
- 子序列最大连续和(动态规划、分治)
- 在一个数组中找到连续的子数组最大的乘积
- 找出数组中的最大连续乘积子串
- 动态规划经典问题03:数组中最大的数对差(或最小的数对差)
- 动态规划-循环数组的最大子数组和
- 动态规划:最大连续子序列乘积
- 动态规划求不相邻的最大子数组和
- C语言求连续最大子数组和的方法