紫书第八章-----高效算法设计(算法分析初步)

/*
    本程序参考刘汝佳《算法竞赛入门经典》(第2版)
    下面的题目,不断优化,程序时间复杂度逐渐变小。
    【题目叙述】
        给出一个长度为N的序列:a1,a2,……,an,求最大连续和。
    找到1=

#include

using namespace std;

//数组下标从1开始

//思路一:暴力枚举
int max_sum1(int a[],int n){
    int best=a[1];
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            int sum=0;
            for(int k=i;k<=j;k++) sum+=a[k];
            if(sum>best) best=sum;
        }
    }
    return best;
}

//思路二:递推前n项和
int max_sum2(int a[],int n){
    int best=a[1];
    int *s=new int[n+1];
    s[0]=0;
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++)
            best=max(best,s[j]-s[i-1]);
    }
    delete[] s;
    return best;
}

//思路三:分治法
//左闭右开区间
int max_sum3(int a[],int x,int y){
    int v,l_sum,r_sum,best;
    if(y-x==1) return a[x];
    int mid=x+(y-x)/2;
    best=max(max_sum3(a,x,mid),max_sum3(a,mid,y));
    v=0;l_sum=a[mid-1];
    for(int i=mid-1;i>=x;i--) l_sum=max(l_sum,v+=a[i]);
    v=0;r_sum=a[mid];
    for(int i=mid;ireturn max(best,l_sum+r_sum);
}

//思路四:动态规划
int max_sum4(int a[],int n){
    int best=a[1],cur_sum=0;//cur_sum表示到目前状态下的最大连续和
    for(int i=1;i<=n;i++){
        if(cur_sum<=0) cur_sum=a[i];
        else cur_sum+=a[i];
        best=max(best,cur_sum);
    }
    return best;
}

int main()
{
    int a[7]={0,3,4,-6,4,5,-2};
    cout<6)<cout<6)<cout<1,6)<cout<6)<return 0;
}

你可能感兴趣的:(紫书第八章-----高效算法设计(算法分析初步))