最大子段和算法 不同复杂度方法实现

来源:互联网 发布:json和js对象的区别 编辑:程序博客网 时间:2024/06/05 19:02

没事写写算法,连连脑子。

简单的实现最大子段和算法,所谓最大子段和,简单来说就是给定数列中,求连续数字和中最大的;

如数列-2,7,-6,9,4,2,-4,5。最大子段和是7+-6+9+4+2+-4+5 = 17,以下给出各种策略的实现代码


//  main.cpp//  LSS_1//  Created by zhaowei on 14-3-26.//  Copyright (c) 2014年 zhaowei. All rights reserved.#include <iostream>using namespace std;//O(n^3) 枚举法void lSS(int *a,int len){   int max = -9999;//最大负数   int sum = 0;   int maxi = 0;//最大子段起点   int maxj = 0;//最大子段终点   for (int i = 0; i<len; i++) {       for (int j = 0; j<len; j++) {            sum = 0;           for (int k = i; k<=j; k++) {                sum+=a[k];            }           if (sum>max) {                max = sum;                maxi = i;                maxj = j;            }        }    }   cout<<"maxi :"<<maxi<<endl;   cout<<"maxj :"<<maxj<<endl;   cout<<"LSS  :"<<max<<endl;}//O(n^2) 枚举法1void lSS_1(int *a,int len){   int max = -9999;   int maxi = 0;//最大子段起点   int maxj = 0;//最大子段终点   int temp;   int *sum = newint[len];    sum[0] = a[0];   for (int i = 1; i<len; i++) {        sum[i] = sum[i-1] + a[i];        //cout<<sum[i]<<" ";    }    //cout<<endl;   for (int j = 0; j<len; j++) {       for (int k = 0; k<len; k++) {            temp = sum[k] - sum[j];           if (temp>max) {                max = temp;                maxi = j+1;                maxj = k;            }        }    }   cout<<"maxi :"<<maxi<<endl;   cout<<"maxj :"<<maxj<<endl;   cout<<"LSS  :"<<max<<endl;}//分治策略的子函数int crossMax(int *a,int p,int q,int r){   int lSum = -9999;   int rSum = -9999;   int sum = 0;   for (int i = q; i>=0; i--) {        sum+=a[i];       if (sum>lSum) {            lSum = sum;        }    }        sum = 0;   for (int j = q+1; j<=r; j++) {        sum+=a[j];       if (sum>rSum) {            rSum = sum;        }    }   // cout<<"l+r"<<lSum+rSum<<endl;   return lSum+rSum;}//O(nlogn) 分治策略int lSS_2(int *a,int p,int r){   int q = (p+r)/2;   int lMax = 0;   int rMax = 0;   int mMax = 0;   if (p == r) return a[p];   else {        lMax =lSS_2(a, p, q);        rMax =lSS_2(a, q+1, r);        mMax =crossMax(a,p,q,r);    }    //cout<< lMax<<" "<<rMax<<" "<<mMax<<endl;   if (lMax>=rMax&&lMax>=mMax) {       return lMax;    }   else if(rMax>=lMax&&rMax>=mMax)       return rMax;   else return mMax;}//O(n)  动态规划int lSS_3(int *a,int n){   int sum = 0,b = 0;   int maxi = 0;   int maxj = 0;   int i;   for (i=0;i<n;i++)    {       if(b>0)            b+=a[i];       else{            b = a[i];            maxi = i;            maxj = i;        }       if(b>sum){            sum = b;            maxj = i;        }    }   cout<<maxi<<"<---->"<<maxj<<endl;   return sum;}int main(int argc,const char * argv[]){    // insert code here...   int a[8] = {-2,7,-6,9,4,2,-4,5};   lSS(a, 8);   lSS_1(a, 8);   cout<<"LSS2  :"<<lSS_2(a, 0, 7)<<endl;   cout<<"LSS3  :"<<lSS_3(a,8)<<endl;   return 0;}


0 0
原创粉丝点击