最大子段和问题(蛮力法,分治法,动态规划法)

本文深入探讨了三种求解最大子段和问题的算法:蛮力法、分治法和动态规划法。通过对比不同算法的时间复杂度,揭示了算法优化的重要性。文章详细解释了每种方法的实现思路,并提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;
void manlifa(int a[],int n)
{
    int maxsum=0;
    for(int i=0;i<n;i++)
    {
        int sum=0;
        for(int j=i;j<n;j++)
        {
            sum+=a[j];
            if(sum>maxsum)
                maxsum=sum;
        }
    }
    cout<<"蛮力法:"<<"最大子段和为:"<<maxsum<<endl;
}
int fenzhifa(int a[],int first,int end)
{
	if(first==end)
		return a[first];
	else
	{
		int sum=0;
		int mid=(first+end)/2;
		int sumLeft=fenzhifa(a,first,mid);
		int sumRight=fenzhifa(a,mid+1,end);
		int s1=0,lefts=0;
		for(int i=mid;i>=first;i--)
		{
			lefts+=a[i];
			if(lefts>s1)
				s1=lefts;
		}
		int s2=0,rights=0;
		for(int i=mid+1;i<=end;i++)
		{
			rights+=a[i];
			if(rights>s2)
				s2 = rights;
		}
		sum=s1+s2;
		if(sumLeft>sum)
			sum=sumLeft;
		if(sumRight>sum)
			sum=sumRight;
		return sum;
	}
}
void dongtaiguihuafa(int a[],int n)
{
    int b[n];
    int maxsum=0;
    b[0]=a[0];
    for(int i=1;i<n;i++)
    {
        if(b[i-1]>0)
            b[i]=b[i-1]+a[i];
        else
            b[i]=a[i];
    }
    for(int j=0;j<n;j++)
    {
        if(b[j]>maxsum)
            maxsum=b[j];
    }
    cout<<"动态规划法:"<<"最大子段和为:"<<maxsum<<endl;
}
int main()
{
    int n;
    cin>>n;
    int a[n];
    int w=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]<0)
            w++;
    }
    if(w==n)
        cout<<"子段和为0"<<endl;
    else
    {
        manlifa(a,n);
        cout<<"分治法:";
        cout<<"最大子段和为:"<<fenzhifa(a,0,n-1)<<endl;
        dongtaiguihuafa(a,n);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值