栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C C++ 最大子列和

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C C++ 最大子列和

8
4 -3 5 -2 -1 2 6 -2
11


#pragma warning(disable : 4996)
#include
using namespace std;

const int MaxSize = 100001;

int myFind(int a[], int low, int high);
int myFindCross(int a[], int low, int mid, int high);
int myFindMax(int x, int y, int z);

int main() {
	int a[MaxSize] = { 0, };
	int num;
	cin >> num;
	for (int i = 0; i < num; i++)
		cin >> a[i];
	int res = myFind(a, 0, num - 1);
	cout << res;
	return 0;
}

int myFind(int a[], int low, int high) {
	if (low == high)
		return a[low];
	else {
		int mid = (low + high) / 2;
		int left_sum = myFind(a, low, mid);
		int right_sum = myFind(a, mid + 1, high);
		int cross_sum = myFindCross(a, low, mid, high);
		return myFindMax(left_sum, right_sum, cross_sum);
	}
}

int myFindCross(int a[], int low, int mid, int high) {			//线性复杂度
	int left_c = 0;				//所以至少为0
	int right_c = 0;
	int sum = 0;
	for (int i = mid; i >= low; i--) {
		sum += a[i];
		if (sum > left_c)
			left_c = sum;
	}
	sum = 0;				//记得重置
	for (int i = mid + 1; i <= high; i++) {
		sum += a[i];
		if (sum > right_c)
			right_c = sum;
	}
	return left_c + right_c;
}

int myFindMax(int x, int y, int z) {
	int max = 0;
	if (x > max)
		max = x;
	if (y > max)
		max = y;
	if (z > max)
		max = z;
	return max;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854157.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号