最大子列和问题的四种算法附世界未解之谜(就是本菜鸡不懂=_=)

#include<iostream>
#include<time.h>
using namespace std;

#define MAXSIZE 100

clock_t start, stop;
double duration;

int MaxSubseqSum1(int a[], int N) {
    
    
	int ThisSum, MaxSum = 0;
	int i, j, k;
	for (i = 0; i < N; i++) {
    
    
		for (j = i; j < N; j++) {
    
    
			ThisSum = 0;
			for (k = i; k <= j; k++)
				ThisSum += a[k];
			if (ThisSum > MaxSum)
				MaxSum = ThisSum;
		}
	}
	return MaxSum;
}

int MaxSubseqSum2(int a[], int N) {
    
    //
	int ThisSum, MaxSum = 0;
	int i, j;
	for (i = 0; i < N; i++) {
    
    
		ThisSum = 0;
		for (j = i; j < N; j++) {
    
    
			ThisSum += a[j];
			if (ThisSum > MaxSum)
				MaxSum = ThisSum;
		}
	}
	return MaxSum;
}

int Max3(int A, int B, int C)
{
    
     /* 返回3个整数中的最大值 */
	return A > B ? A > C ? A : C : B > C ? B : C;
}

int DivideAndConquer(int List[], int left, int right)
{
    
     /* 分治法求List[left]到List[right]的最大子列和 */
	int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */
	int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/

	int LeftBorderSum, RightBorderSum;
	int center, i;

	if (left == right) {
    
     /* 递归的终止条件,子列只有1个数字 */
		if (List[left] > 0)  return List[left];
		else return 0;
	}

	/* 下面是"分"的过程 */
	center = (left + right) / 2; /* 找到中分点 */
	/* 递归求得两边子列的最大和 */
	MaxLeftSum = DivideAndConquer(List, left, center);
	MaxRightSum = DivideAndConquer(List, center + 1, right);

	/* 下面求跨分界线的最大子列和 */
	MaxLeftBorderSum = 0; LeftBorderSum = 0;
	for (i = center; i >= left; i--) {
    
     /* 从中线向左扫描 */
		LeftBorderSum += List[i];
		if (LeftBorderSum > MaxLeftBorderSum)
			MaxLeftBorderSum = LeftBorderSum;
	} /* 左边扫描结束 */

	MaxRightBorderSum = 0; RightBorderSum = 0;
	for (i = center + 1; i <= right; i++) {
    
     /* 从中线向右扫描 */
		RightBorderSum += List[i];
		if (RightBorderSum > MaxRightBorderSum)
			MaxRightBorderSum = RightBorderSum;
	} /* 右边扫描结束 */

	/* 下面返回"治"的结果 */
	return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}

int MaxSubseqSum3(int a[], int N) {
    
    
	return DivideAndConquer(a, 0, N - 1);
}

int MaxSubseqSum4(int a[], int N) {
    
    
	int ThisSum, MaxSum;
	int i;
	ThisSum = MaxSum = 0;
	for (i = 0; i < N; i++) {
    
    
		ThisSum += a[i];
		if (ThisSum > MaxSum)
			MaxSum = ThisSum;
		else if (ThisSum < 0)
			ThisSum = 0;
	}
	return MaxSum;
}

int main() {
    
    
	int n, a[MAXSIZE], i, s = 100000;
	cout << "input the length of your subsequence:";
	cin >> n;
	cout << "input your subsequence:";
	for (i = 0; i < n; i++)
		cin >> a[i];

	start = clock();
	for (i = 0; i < s; i++)
		MaxSubseqSum1(a, n);
	stop = clock();
	duration = ((double)(stop - start)) / CLK_TCK;
	cout << "first program:" << duration << endl;

	start = clock();
	for (i = 0; i < s; i++)
		MaxSubseqSum2(a, n);
	stop = clock();
	duration = ((double)(stop - start)) / CLK_TCK;
	cout << "second program:" << duration << endl;

	start = clock();
	for (i = 0; i < s; i++)
		MaxSubseqSum3(a, n);
	stop = clock();
	duration = ((double)(stop - start)) / CLK_TCK;
	cout << "third program:" << duration << endl;

	start = clock();
	for (i = 0; i < s; i++)
		MaxSubseqSum4(a, n);
	stop = clock();
	duration = ((double)(stop - start)) / CLK_TCK;
	cout << "forth program:" << duration << endl;
}

世界未解之谜,为什么代码运行出来的结果在这里插入图片描述
算法三的分而治之怎么回事???

而在PTA提交的结果很对啊

算法2:在这里插入图片描述
算法3:在这里插入图片描述
算法4:在这里插入图片描述为什么?

猜你喜欢

转载自blog.csdn.net/cwindyc/article/details/107073259