分治法解最大连续公共子序列

本文探讨了如何运用分治策略解决数组中找到最大连续子序列的问题。通过将数组对半划分,分别在左、右及中间部分寻找最大子序列,然后递归合并以得出整体的最大连续子序列。

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

这篇文章是在自学算法导论练习的

直接入正题:

最大连续子序列(分治法)

原理:

       一串数组可以对半分,一串数组的最大连续子序列可能是在左端,右端以及跨越中间

       依次递归分解求得最小块的最大值,再向上组合成整段最大连续子序列

#include<iostream>
#include<stdlib.h>
using namespace std;
int max(int a,int b,int c)//寻找三者最大 
{
	int max;
	if(a>b)
		max=a;
	else
		max=b;
	if(c>max)
		max=c;
	return max;
}
int MaxCross(int *data,int left,int right)//寻找过中间元素的最大 
{
	int maxleft,maxright,sum;
	int mid=(left+right)/2,k;
	if(right-left==1)//如果相距只有1时直接比较(因为mid可能等于左右) 
	{
		return max(data[left],data[right],data[left]+data[right]);
	}
	maxleft=-100000;//寻找mid左边最大 
	sum=0;
	for(k=mid;k>=left;k--)//注意必须是从mid-- 
	{
		sum+=data[k];
		if(sum>maxleft)
			maxleft=sum;
	}	
	maxright=-100000;//寻找mid右边最大 
	sum=0;
	for(k=mid+1;k<=right;k++)
	{
		sum+=data[k];
		if(sum>maxright)
			maxright=sum;
	}
	return maxleft+maxright;//返回最大和 
}
int Findmax(int *data,int left,int right)
{
	int maxleft,maxright,maxcross,mid,maxlist;
	mid=(left+right)/2;
	//左中右顺序可以任意 
	maxcross=MaxCross(data,left,right);//寻找过中最大
	//寻找左边最大 
	if(mid>left) //如果只有一个元素直接返回 
		maxleft=Findmax(data,left,mid);
	else
		maxleft=data[left];
	//寻找右边最大 
	if(mid+1<right)//如果只有一个元素直接返回 
		maxright=Findmax(data,mid+1,right);
	else
		maxright=data[right];

	return max(maxcross,maxleft,maxright);//返回左中右最大 
}
int main()
{
	int n,k,*data;
	while(1)
	{
		cout<<"请输入元素个数:";
		cin>>n;
		data=new int [n];
		cout<<"请输入序列:";
		for(k=0;k<n;k++)
			cin>>data[k];
		cout<<Findmax(data,0,n-1)<<endl;
		system("pause");
		system("cls");
	} 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值