最大子序列和问题

 代码:

#include <iostream>
using namespace std;

//暴力求解  T(N)=O(n^3) 
int  MaxSubSequm1(int list[], int n)
{
	int MaxSum = 0;
	for(int i = 0; i < n; i++)
	{
		for(int j = i; j < n; j++)
		{
			int ThisSum = 0;
			for(int k = i; k < j; k++)
			{
				ThisSum += list[k];
			}
			if(ThisSum > MaxSum)
			{
				MaxSum = ThisSum;
			}
		}
	}
	return MaxSum;
}

//暴力求解  T(N)=O(n^2) 
int  MaxSubSequm2(int list[], int n)
{
	int MaxSum = 0;
	for(int i = 0; i < n; i++)
	{
		int ThisSum = 0;
		for(int j = i; j < n; j++)
		{
			ThisSum += list[j];
			if(ThisSum > MaxSum)
			{
				MaxSum = ThisSum;
			}
		}
	}
	return MaxSum;
}

//分而治之 T(N)=O(nlogn) 
int Maxfun( int A, int B, int C )
{ 
    return (A > B) ? ((A > C) ? A : C) : ((B > C) ? B : C);
}
int DivideAndConquer(int list[], int left, int right)
{
	int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */
    int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/
 
    int LeftBorderSum, RightBorderSum;
    int center, i;
    
    if(left == right)
    {
    	if(list[left] < 0)
    	{
    		return 0;
		}
		else{
			return list[left];
		}
	}
	else{
		center = (left + right) / 2; 
	}
	
	MaxLeftSum = DivideAndConquer(list, left, center);
	MaxRightSum = DivideAndConquer(list, center+1, right);
	
	// 求跨分界线的最大子列和
	LeftBorderSum = 0; MaxLeftBorderSum = 0;
	RightBorderSum = 0; MaxRightBorderSum = 0;
	//从中线向左扫描
	for(int i = center; i > left; i--)
	{
		LeftBorderSum += list[i];
		if(LeftBorderSum > MaxLeftBorderSum)
		{
			MaxLeftBorderSum = LeftBorderSum;
		}
	}
	//从中线向右扫描
	for(int i = center; i < right; i++)
	{
		RightBorderSum += list[i];
		if(LeftBorderSum > MaxRightBorderSum)
		{
			MaxRightBorderSum = LeftBorderSum;
		}
	}
	
	//返回"治"的结果
	return Maxfun( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );
}
int MaxSubSequm3(int list[], int n)
{
	return DivideAndConquer(list, 0, n-1);
}


//在线处理 T(N)=O(n) 
int  MaxSubSequm4(int list[], int n)
{
	int ThisSum = 0;
	int MaxSum = 0;
	for(int i = 0; i < n; i++)
	{
		ThisSum += list[i]; 
		if(ThisSum > MaxSum)
		{
			MaxSum = ThisSum;
		}
		else if(ThisSum < 0)
		{
			ThisSum = 0;
		}
	}
	return MaxSum;
}  

void test()
{
	//int list[6] = { -2, 11, -4, 13, -5, -2 };
	int list[1] = {-1};
	//int list[9] = {-2,1,-3,4,-1,2,1,-5,4};
	int n;
	n = sizeof(list) / sizeof(list[0]);
	int Maxsum1, Maxsum2, Maxsum3, Maxsum4;
	Maxsum1 = MaxSubSequm1(list, n);
	
	Maxsum2 = MaxSubSequm2(list, n);
	
	Maxsum3 = MaxSubSequm3(list, n);
	
	Maxsum4 = MaxSubSequm4(list, n);
	
	cout << Maxsum1 << endl;
	cout << Maxsum2 << endl;
	cout << Maxsum2 << endl;
	cout << Maxsum4 << endl;
}

int main()
{
	test();
	
	system("pause");
	return 0;
}

  

posted @ 2022-08-31 19:59  KYZH  阅读(19)  评论(0)    收藏  举报