《算法导论》最大子数组和

1.暴力求解

#include <iostream>
#define N 100
using namespace std;
int main() {
	int array[N];
	int i, j, n, sum;
	int start, end, maxSum=-99999;
	cin>>n;
	for(i = 0; i < n; i++)
		cin>>array[i];
	for(i = 0; i < n; i++)
	{
		sum = 0;
		for(j = i; j < n; j++) {
			sum += array[j];
			if(sum > maxSum) {
				maxSum = sum;
				start = i;
				end = j;
			}
		}
	}
	cout<<"("<<start<<","<<end<<")"<<" "<<maxSum <<endl;
	return 0;
} 
2.分治思想

#include <cstdio>
#include <iostream>
#define N 100
using namespace std;
int array[N];
typedef struct { 
	int start;
	int end;
	int sum;
} MaxSubarray;
MaxSubarray findMaxCrossSubarray(int array[], int low, int mid, int high) {
	MaxSubarray maxSubarray;
	int sum, maxLeft, maxRight;
	int leftSum = -999999, rightSum = -999999;
	sum = 0;
	for(int i = mid; i >= low; i--) {
		sum += array[i];
		if(sum > leftSum) { 
			leftSum = sum;
			maxLeft = i;			
		}
	}
	sum = 0;
	for(int i = mid + 1; i <= high; i++){
		sum += array[i];
		if(sum > rightSum){
			rightSum = sum;
			maxRight = i;
		}
	}
	maxSubarray.start = maxLeft;
	maxSubarray.end = maxRight;
	maxSubarray.sum = leftSum + rightSum;
	return maxSubarray;
}

MaxSubarray findMaxSubarray(int array[], int low, int high) {
	if(low == high) {
		MaxSubarray maxSubarray;
		maxSubarray.start = low;
		maxSubarray.end = high;
		maxSubarray.sum = array[low];
		return maxSubarray;
	}else{
		int mid = (low + high) / 2;
		MaxSubarray leftMaxSubarray;
		leftMaxSubarray = findMaxSubarray(array, low, mid);
		MaxSubarray rightMaxSubarray;
		rightMaxSubarray = findMaxSubarray(array, mid+1, high);
		MaxSubarray arossMaxSubarray;
		arossMaxSubarray = findMaxCrossSubarray(array, low, mid, high);
		if(leftMaxSubarray.sum >= rightMaxSubarray.sum && leftMaxSubarray.sum >= arossMaxSubarray.sum) {
			return leftMaxSubarray;
		} else if(rightMaxSubarray.sum >= leftMaxSubarray.sum && rightMaxSubarray.sum >= arossMaxSubarray.sum) {
			return rightMaxSubarray;
		} else { 
			return arossMaxSubarray;
		}
	}
}
int main() {
	int n;
	scanf("%d",&n);
	for(int i = 0; i <= n; i++)
		cin>>array[i];
	MaxSubarray maxSubarray = findMaxSubarray(array,0,n-1);
	printf("(%d,%d) %d", maxSubarray.start, maxSubarray.end, maxSubarray.sum);
	return 0; 
} 

3.线性时间算法(算法导论习题4.1-5)

#include <iostream>
#define N 100
using namespace std;
typedef struct {
	int start;
	int end;
	int sum;
} MaxSubarray;
MaxSubarray findMaxSubarray(int array[], int length) {
	MaxSubarray maxSubarray;
	int boundarySum, maxSum;
	boundarySum = array[0];
	maxSum = array[0];
	for(int i = 1; i < length; i++) {
		if(boundarySum + array[i] > array[i])
			boundarySum += array[i];
		else{
			maxSubarray.start = i;
			boundarySum = array[i];
		}
		if(boundarySum > maxSum){
			maxSubarray.end = i; 
			maxSum = boundarySum;
		}
	}
	maxSubarray.sum = maxSum;
	return maxSubarray;
}
int main () {
	int array[N];
	int i, n;
	cin>>n;
	for(i = 0; i < n; i++)
		cin>>array[i];
	MaxSubarray maxSubrray = findMaxSubarray(array, n-1);
	cout<<"("<<maxSubrray.start<<","<<maxSubrray.end<<")"<<" "<<maxSubrray.sum <<endl;
	return 0;
}

 

4.测试数据

16
13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值