最大子段积

来源:互联网 发布:手机和mac照片同步 编辑:程序博客网 时间:2024/05/21 19:21
//动态规划//法一:#include <stdio.h>#include <stdlib.h>#define MAXN 1int min(int a,int b){    return a>b?b:a;}int max(int a,int b){    return a>b?a:b;}//只有一个负数,返回1int 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;}*/

1 0
原创粉丝点击