日常编程笔记 | 2022.10.3 | 分治法最大子列和

本文记录了使用分治法解决寻找数组中不连续元素最大和的问题。最初思路有误,将数列分为left、mid、right三部分,后来修正为考虑每部分中经过mid的左右联通部分。

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

选出了不连续的元素之和

一开始思路错误了,这样编写程序只能选出不连续的子列和,但题目一般是要求连续的

//the maximum of subsequences 
//Divide-and-Conquer
#include<stdio.h>
#include<stdlib.h>

int* GeneArray(int n);
int MaxSubSeq(int* a, int n);
int Sort(int*a, int left, int right);
int Merge(int max1, int max2);

int main()
{
	int n; //the size of the array
	int maxsum;//the maximum of the submatrix
	
	printf("Please input the size of the array to be sorted : ");
	scanf("%d",&n);
	
	int* array = GeneArray(n);
	
	int i;
	for(i = 0; i < n; i++)
	{
		printf("%d ", array[i]);
	}
	
	maxsum = MaxSubSeq(array, n);
	
	printf("\nthe maximum of subsequence is %d", maxsum);
	
	return 0;
}

int MaxSubSeq(int*a, int n)
{
	int max;
	max = Sort(a, 0, n - 1);
	return max;
}

int Sort(int*a, int left, int right)
{
	int mid = left + (right - left)/2;
	
	if(left == right)
	{
		return a[left];
	}
	
	else		
	{
		int max1 = Sort(a, left, mid);//return max1
		int max2 = Sort(a, mid + 1, right);//return max2
		
		return Merge(max1, max2);
	}
}

int Merge(int max1, int max2)
{
	int sum = max1 + max2;
	
	int m0 = max1 > max2 ? max1 : max2;
	
	int max = sum > m0 ? sum : m0; 
	
	return max;
}

int* GeneArray(int n)
{
	srand((unsigned int)time(0));//initialize the seed
	
	int i;
	int*array = (int*)malloc(sizeof(int)*n);
	
	for(i = 0; i < n; i++)
	{
		array[i] = rand()%200 - 100;//to generate random number from -100 to 100 
	}
	
	return array;
}

原来是把数列分成了三部分,left mid right, 现在只要每一小块都把经过mid 的左右联通部分考虑进去就可以了

C源码
//the maximum of subsequences 
//Divide-and-Conquer
#include<stdio.h>
#include<stdlib.h>

int Max(int a, int b);
int* GeneArray(int n);
int SubMax(int*a, int left, int right);

int main()
{
	int n; //the size of the array
	int maxsum;//the maximum of the submatrix
	
	printf("Please input the size of the array to be sorted : ");
	scanf("%d",&n);
	
	int* array = GeneArray(n);
	
	int i;
	for(i = 0; i < n; i++)
	{
		printf("%d ", array[i]);
	}
	
	maxsum = SubMax(array, 0, n - 1);
	
	printf("\nthe maximum of subsequence is %d", maxsum);
	
	return 0;
}

int SubMax(int*a, int left, int right)
{
	
	if(left == right)//when only one element left
	{
		return a[left];//return the one
	}
	
	int mid = left + (right - left)/2;
	
	int leftmax = 0;//merely the left part
	int rightmax = 0;//merely the right part
	int bordermax = 0;//the maximum that crossed the mid
	int borderleft = 0;//the maximum of the left part started from the mid
	int borderright = 0;//the maximum of the right part started from the mid + 1
	int leftsum = 0;//the sum of partial left part started from the mid
	int rightsum = 0;//the sum of partial right part started from the mid + 1
	int max = 0;//the maximum sum of the subsequence
	
	int i;
	
	//dividing
	leftmax = SubMax(a, left, mid);
	rightmax = SubMax(a, mid + 1, right); 
	
	//consider the left part
	for(i = mid; i >= left; i--)
	{
		leftsum += a[i];
		if(leftsum > borderleft)
			borderleft = leftsum;
	}
	
	//consider the right part
	for(i = mid + 1; i <= right; i++)
	{
		rightsum += a[i];
		if(rightsum > borderright)
			borderright = rightsum;
	}	
	
	bordermax = borderleft + borderright;
	
	max = Max(bordermax, Max(rightmax, leftmax));//the max depends on the left, the right and the the one crossed the border 
	
	return max;
	
}



int* GeneArray(int n)
{
	srand((unsigned int)time(0));//initialize the seed
	
	int i;
	int*array = (int*)malloc(sizeof(int)*n);
	
	for(i = 0; i < n; i++)
	{
		array[i] = rand()%200 - 100;//to generate random number from -100 to 100 
	}
	
	return array;
}

int Max(int a, int b)
{
	if(a >= b)
		return a;
	else if(b > a)
		return b;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值