您的位置:首页 > 编程语言

编程之美:第二章 数字之魅 2.15子数组之和的最大值(二维)

2015-08-03 00:58 295 查看
/*
子数组之和的最大值(二维):
假设已经确定上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左边界。
把每一列中第a行和第c行之间的元素看成一个整体,即求数组(BC[a],...,BC[M])中最大的一段,其中BC[i] = B[a][i] + ... + B[c][i],枚举矩形上下边界,
然后利用一维情况确定左右边界,可以得到二维问题的解。时间复杂度为O(n^2*m)

输入:
2 3(行和列)
1 -2 3
-4 5 6
输出:
12
*/ 

/*
关键:
1 假设已经确定上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左边界。
把每一列中第a行和第c行之间的元素看成一个整体,即求数组(BC[a],...,BC[M])中最大的一段,其中BC[i] = B[a][i] + ... + B[c][i],枚举矩形上下边界,
然后利用一维情况确定左右边界,可以得到二维问题的解。时间复杂度为O(n^2*m)
2 	for(int a = 1 ; a <= row ; a++)
	{
		for(int c = a ; c <= row ; c++)
		{
			int iStart = BC(a,c,col,pArr);//枚举上下边界,将一列看成一个数字的结果
			int iSum = BC(a,c,col,pArr);//记录多个由一列看成的数字中的最大值
3 			for(int i = col-1 ; i >= 1 ; i--)
			{
				if(iStart < 0)
				{
					iStart = BC(a,c,i,pArr);
				}
				else
				{
					iStart += BC(a,c,i,pArr);
				}
				if(iStart > iSum)
				{
					iSum = iStart;
				}
				if(iSum > max)
				{
					max = iSum;//所有枚举中的最大值
*/

#include <stdio.h>
const int MAXSIZE = 100;
const int INF = 0x7fffffff;

int BC(int low,int high,int col,int pArr[][MAXSIZE])//二维数组作为参数,第二维必需写出
{
	int iSum = 0;
	for(int i = low ; i <= high ; i++)
	{
		iSum += pArr[i][col];
	}
	return iSum;
}

int maxSum(int pArr[MAXSIZE][MAXSIZE],int row,int col)
{
	int max = -INF;
	for(int a = 1 ; a <= row ; a++)
	{
		for(int c = a ; c <= row ; c++)
		{
			int iStart = BC(a,c,col,pArr);//枚举上下边界,将一列看成一个数字的结果
			int iSum = BC(a,c,col,pArr);//记录多个由一列看成的数字中的最大值
			for(int i = col-1 ; i >= 1 ; i--)
			{
				if(iStart < 0)
				{
					iStart = BC(a,c,i,pArr);
				}
				else
				{
					iStart += BC(a,c,i,pArr);
				}
				if(iStart > iSum)
				{
					iSum = iStart;
				}
				if(iSum > max)
				{
					max = iSum;//所有枚举中的最大值
				}
			}
		}
	}
	return max;
}

void process()
{
	int n,m;
	while(EOF != scanf("%d %d",&n,&m))
	{
		int iArr[MAXSIZE][MAXSIZE];
		for(int i = 1 ; i <= n ; i++)
		{
			for(int j = 1 ; j <= m ;j++)
			{
				scanf("%d",&iArr[i][j]);
			}
		}
		printf("%d\n",maxSum(iArr,n,m));
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: