//最大子序列递进探究

//最大子序列递进探究
#include<iostream>
using namespace std;

void maxSubSeq(int *A,int n)//穷举法+求和
{
    int max=0;
    for(int i=0;i<n;i++)//产生子集和
        {
            int sum=0;
        for(int j=0;j<n;j++)
        {
            sum+=A[j];
            if(sum>max)//更新最大
                max=sum;
        }
        }
        cout<<max;
}
//分治法首先用迭代把数组平分,平分,平分直到到单位元素,在对其每一个子序列求和,求最大
int maxSubSeq(int *A,int left,int right)
{
    if(left==right)        //
        if(A[left]>0)
            return A[left];
        else
            return 0;
    int center=(left+right)/2;  //中间值平分
    int maxLeft=0,maxRight=0;
    maxLeft=maxSubSeq(A,left,center);  //左最大子集
    maxRight=maxSubSeq(A,center+1,right);//右最大子集
    int sumLeft=0,maxLeftSum=0;
    for(int i=center;i>=left;i--)  //穷举分治
    {
        sumLeft+=A[i];
        if(sumLeft>maxLeftSum)
            maxLeftSum=sumLeft;
    }
    int sumRight=0,maxRightSum=0;
    for(int i=center+1;i<=right;i++)
    {
        sumRight+=A[i];
        if(sumRight>maxRightSum)
            maxRightSum=sumRight;
    }
    return max(maxLeft,maxRight,maxLeft+maxRight);//合并
}
/*
   先对每一个元素加入当前和,判断当前和与最大和的大小,
   如果大于最大和交换,在判断当前和是否小于0,如果小于0,
   则永远不会是最大和的积极因素,把它化为0
*/
int Maxsubsequeue(const int A[],int N)
{
    int ThisSum=0,MaxSum=0;int i;
    for(i=0;i<N;i++)
    {
        ThisSum+=A[i];
        if(ThisSum>MaxSum)
            MaxSum=ThisSum;
        else if(ThisSum<0)
            ThisSum=0;
     }
    return MaxSum;
}
/*用一个数组记录在每一个i值时最大的子序列和为s[i];
 则他的前一项为s[i-1];
           当A[i]>0是是s[i]=A[i]+s[i-1];
           当A[i]<0时s[i]=s[s-1];
           再对是s[i]排序*/
#define MAXN 10
int findmax(int *s,int n)
{
    int max=0;
    for(int i=0;i<n;i++)
        if(s[i]>max)
            max=s[i];
    return max;
}

int MaxSubSeq(int *A,int n)
{
    int s[MAXN];//记录每个i时的最大子序列
    s[0]=A[0];
    for(int i=1;i>0&&i<n;i++)
    {
        if(A[i]>0)         //计算存储每个子序列值
            s[i]=s[i-1]+A[i];
        else
            s[i]=s[i-1];
    }
    int m=findmax(s,n);

}









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值