最大连续子序列乘积
2012-09-25 10:41
405 查看
问题描述:给定一个整数序列(可能有正数,0和负数),求它的一个连续最大子序列乘积,如果乘积为负数,输出-1
分析:假设数组为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[1]=Min[1]=a[1]。代码如下:
/*
给定一个整数数组,有正有负数,0,正数组成,数组下标从1算起
求最大连续子序列乘积,并输出这个序列,如果最大子序列乘积为负数,那么就输出-1
用Max[i]表示以a[i]结尾乘积最大的连续子序列
用Min[i]表示以a[i]结尾乘积最小的连续子序列 因为有复数,所以保存这个是必须的
*/
分析:假设数组为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[1]=Min[1]=a[1]。代码如下:
/*
给定一个整数数组,有正有负数,0,正数组成,数组下标从1算起
求最大连续子序列乘积,并输出这个序列,如果最大子序列乘积为负数,那么就输出-1
用Max[i]表示以a[i]结尾乘积最大的连续子序列
用Min[i]表示以a[i]结尾乘积最小的连续子序列 因为有复数,所以保存这个是必须的
*/
void longest_multiple(int *a,int n){ int *Min=new int[n+1](); int *Max=new int[n+1](); int *p=new int[n+1](); //初始化 for(int i=0;i<=n;i++){ p[i]=-1; } Min[1]=a[1]; Max[1]=a[1]; int max_val=Max[1]; for(int i=2;i<=n;i++){ Max[i]=max(Max[i-1]*a[i],Min[i-1]*a[i],a[i]); Min[i]=min(Max[i-1]*a[i],Min[i-1]*a[i],a[i]); if(max_val<Max[i]) max_val=Max[i]; } if(max_val<0) printf("%d",-1); else printf("%d",max_val); //内存释放 delete [] Max; delete [] Min; }
相关文章推荐
- 小米2013校园招聘笔试题-最大连续子序列乘积
- 《最大连续子序列乘积》解法(动态规划)
- C++编程:最大连续子序列乘积
- 最大连续子序列之和,最大连续子序列乘积
- Weiss-(DSAA - in C,2.12)最大连续子序列乘积
- 题目1501:最大连续子序列乘积
- 最大连续子序列乘积
- 最大连续子序列乘积
- 最大连续子序列乘积
- 最大连续子序列乘积
- 求最大连续子序列乘积
- 求子数组的最大和
- 数组中最大和的子数组
- poj 3041 Asteroids (二分图的最大匹配 第一题)
- HDU 2883 kebab 最大流判满流
- 【二分图|最大匹配】POJ-3041 Asteroids(匈牙利算法dfs、bfs版)
- java如何获得JVM可能的总内存,最大内存,以及空闲内存?
- poj--1459--Power Network(最大流,超级源超级汇)
- 求出能使下式成立的最大数十进制整数3A4B5。
- 洛谷 P1115 最大子段和