UVa 108: Maximum Sum

这道题用暴力解法+动态规划。分析如下:

对于某个1*m的矩阵,即一个数列,求其maximal sub-rectangle,可以通过求最大长连续字串和来求得(这个用到了动态规划)。

那么对于n*m的矩阵,将每列的各个数字求和,将得到一个1*m的矩阵,用上文所说的方法求得的最大和即为该n*m矩阵的所有行数为n的子矩阵中的最大子矩阵和。

那么这道题,通过枚举所有行数为1、2、3.....N 的矩阵(暴力),分别用上述方法压缩矩阵求最大连续字串和,找出其中最大值,即为所求结果。

我的解题代码如下:

 

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <cstdlib>

#include <string>

#include <algorithm>

using namespace std;



int table[100][100];

int sum[100];

int N;



int max_continuous_sum()

{

	int maxs=0,s=0;

	for(int i=0; i<N; i++)

	{

		if(s>=0) s+=sum[i];

		else s=sum[i];

		maxs = maxs>s ? maxs : s;

	}

	return maxs;

}

int main()

{

	cin >> N;

	int maxsum=0;

	int tmp;

	for(int i=0; i<N; i++)

	{

		for(int j=0; j<N; j++)

		{

			cin >> table[i][j];

			sum[j]=table[i][j];

		}

		tmp = max_continuous_sum();

		maxsum = maxsum>tmp ? maxsum : tmp;

		for(int j=i-1; j>=0; j--)

		{

			for(int k=0; k<N; k++)

				sum[k]+=table[j][k];

			tmp = max_continuous_sum();

			maxsum = maxsum>tmp ? maxsum : tmp;

		}

	}

	cout << maxsum << endl;

	return 0;

}


 

 

你可能感兴趣的:(uva)