子数组的最大乘积 子数组最大和

来源:互联网 发布:乐普数据乐宝宝下载 编辑:程序博客网 时间:2024/05/03 15:29

问题描述:
                         给定一个长度为N的整数数组,求子数组的最大乘积。
                         分析:

                                    例如: int a[12]={1,2,-1,3,4,5,-2,6,4,8,-3};子数组的最大乘积,要求时间在O(n)内完成,这里用动态规划的思想来解决,因为这个问题具有  后无效性,即当前子数组的最大乘积与后边的无关,我们可以用Tail[]数组来存储当前子数组的最大乘积,那么Tail[i]=max(Tail[i-1]*a[i],a[i]);大家可以仔细思考下,然后再取Tail中最大的值即可。

//子数组的最大乘积#include<iostream>using namespace std;int qmax(int x,int y){return x>y?x:y;} int main(){int a[12]={1,2,-1,3,4,5,-2,6,4,8,-3},i,j;int tail[12];tail[0]=a[0];int maxnum=a[0]; for(i=1;i<12;i++){tail[i]=qmax(a[i],tail[i-1]*a[i]);if(maxnum<tail[i])    maxnum=tail[i];} cout<<maxnum<<endl;return 0;} 

同理可以求子数组最大和

#include<iostream>using namespace std;int qmax(int x,int y){return x>y?x:y;} int main(){int a[12]={1,2,-1,3,4,5,-2,6,4,8,-3},i,j;int tail[12];tail[0]=a[0];int maxnum=a[0]; for(i=1;i<12;i++){tail[i]=qmax(a[i],tail[i-1]+a[i]);if(maxnum<tail[i])    maxnum=tail[i];} cout<<maxnum<<endl;return 0;} 

还有子数组最大乘积,都是动态规划的简单应用,适合初学者,大神可以直接忽略。

//子数组最长递增子序列#include<iostream>using namespace std;int main(){int a[9]={1,-1,2,-3,4,-5,6,-7},i,j;int tail[9];int maxnum=1;for(i=0;i<8;i++){tail[i]=1;for(j=0;j<i;j++){if(a[j]<a[i]){tail[j]=tail[j]+1;}}}for(i=0;i<8;i++)   if(maxnum<tail[i])   maxnum=tail[i];   cout<<maxnum<<endl;return 0;} 


0 0
原创粉丝点击