//动态规划
//法一:
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1
int min(int a,int b)
{
return a>b?b:a;
}
int max(int a,int b)
{
return a>b?a:b;
}
//只有一个负数,返回1
int findmax(int array[],int n)
{
int minproudct;//以当前下标为末尾的序列的最小负子序列
int maxproudct;//以当前下标为末尾的序列的最大正子序列
minproudct=1;
maxproudct=1;
int result=1;//最后结果
for(int i=0;i<=n-1;i++){
if(array[i]>0){
maxproudct*=array[i];
minproudct*=array[i];
}
else if(array[i]==0){
maxproudct=1;
minproudct=1;
}
else{
int temp=maxproudct;
minproudct=min(minproudct,maxproudct*array[i]);
maxproudct=temp*array[i];
}
result=max(result,maxproudct);
}
return result;
}
int main()
{
int array[MAXN];
for(int i=0;i<=MAXN-1;i++)
scanf("%d",&array[i]);
int max=findmax(array,MAXN);
printf("%d",max);
return 0;
}
//法二:
/*
double helper(double data[], int n)
{
double ans = data[0];
double localMax = data[0];//当前位置最大数
double localMin = data[0];//当前位置最小数(乘积存在负负得正的问题,即原本很小的负数成了一个负数反而变大了)
for(int i=1; i<n; ++i)
{
double t1 = max(data[i], max(localMax*data[i], localMin*data[i]) );
double t2 = min(data[i], min(localMax*data[i], localMin*data[i]) );
localMax = t1;
localMin = t2;
ans = localMax > ans ? localMax : ans;
}
return ans;
}
*/
最大子段积
最新推荐文章于 2022-09-12 20:01:37 发布
本文介绍了一种使用动态规划解决数组中最大乘积问题的方法。通过两种不同的实现方式,详细展示了如何处理正数、负数及零的情况,以找到以每个位置结尾的最大和最小乘积序列。
3407

被折叠的 条评论
为什么被折叠?



