Weiss-(DSAA - in C,2.12)最大连续子序列乘积
2016-10-13 18:12
218 查看
-----非原创----
问题描述
给定一个整数序列(可能有正数,0和负数),求它的一个最大连续子序列乘积。比如给定数组a={3, -4, -5, 6, -2},则最大连续子序列乘积为360,即3*(-4)*(-5)*6=360。分析
求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0。假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程为:
Max[i]=max{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
Min[i]=min{a[i], Max[i-1]*a[i], Min[i-1]*a[i]};
初始状态为Max[0]=Min[0]=a[0]。代码如下:
[cpp]
view plain
copy
int max_multiple(int *a,int n)
{
int *Min = new int
();
int *Max = new int
();
Min[0]= Max[0] = a[0];
int max = Max[0];
for(int i=1; i<n; i++){
Max[i] = max3(Max[i-1]*a[i],Min[i-1]*a[i],a[i]); //求三个数中最大值
Min[i] = min3(Max[i-1]*a[i],Min[i-1]*a[i],a[i]); //求三个数中最小值
if(max < Max[i])
max = Max[i];
}
//内存释放
delete [] Max;
delete [] Min;
return max;
}
相关文章推荐
- Weiss-(DSAA - in C,2.12)最大子序列求和
- Weiss-(DSAA - in C,1.3)字谜游戏
- Weiss-(DSAA - in C,2.13)求素数的3个方法
- Weiss-(DSAA - in C,2.19) 大小为N的数组A,其主要元素出现次数超过N/2
- Weiss-(DSAA - in C,2.10)Horner法则求多项式
- Weiss-(DSAA - in C,2.9/2.16)快速求幂(递归与非递归)
- 求最大连续子序列乘积
- 题目1501:最大连续子序列乘积
- 小米2013校园招聘笔试题-最大连续子序列乘积
- 最大连续子序列乘积
- C++编程:最大连续子序列乘积
- 最大连续子序列之和,最大连续子序列乘积
- 最大连续子序列乘积
- 最大连续子序列乘积
- 最大连续子序列乘积
- 《最大连续子序列乘积》解法(动态规划)
- 最大连续子序列乘积
- 怎样实现企业网站最大价值
- 三个数a,b,c找出最大数
- 数据结构练习(40)数对之差的最大值