hdu 1081&poj 1050 To The Max(最大和のサブマトリックス)

2375 ワード

転載は出典を明記してください。http://blog.csdn.net/u012860063
Description
Given a two-dimenininininininintegers,a sub-rectangle is any contiggous s s s s s s s s s s s s s s s s s s s s s rerererererererererererererererererererererereees s s s s s s s s s s s rererererererererererererererererererererererererererererererererererereeeeees s s s s s s s s s s s s s s s s s s s s s rererererererererererererererererererererererererererererererererererererereトas the maximal sub-rectangle. 
As an example、the maximal sub-rectangle of the array: 
0-2-7 0 
9 2-6 2 
-4 1-4 1 
-1 8 0-2 
is in the lower left coner: 
9 2 
-4 1 
-1 8 
and has a sum of 15. 
Input
The input consists of n*N array of integers.The input begis with a single positive intetegan n n ininininininininininininindicating the size of the squararararararary.Thisisisfolleebybybye e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e ininininininininininininininininininesented in row-major order.That is、all numbers in the first row、left to right、then all numbers in the second row、left to right、etc.N may be as large as 100.The numbers in the array will be in the range[127,127]。
Output
Output the sum of the maximal sub-rectangle.
Sample Input
4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2
Sample Output
15
ソurce
Greer New York 2001
N*Nの行列をあげます。その中で一番大きなサブ行列の値を求めてください。
コードは以下の通りです
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
	int i, j, k, t;
	int a, sum, max, N, m[147][147];
	while(~scanf("%d",&N))
	{
		memset(m,0,sizeof(m));
		for(i = 1; i <= N; i++)
		{
			for(j = 1; j <= N; j++)
			{
				scanf("%d",&a);
				m[i][j]+=m[i][j-1]+a;//   i  j     
			}
		}
		max = -128;
		for(i = 1; i <= N; i++)//    
		{
			for(j = i; j <= N; j++)//    
			{
				sum = 0;
				for(k = 1; k <= N; k++)//         
				{
					if(sum < 0)
					sum = 0;
					sum+=m[k][j]-m[k][i-1];
					//m[k][j]-m[k][i-1]   k  i      
					if(sum > max)
					max = sum;
				}
			}
		}
		printf("%d
",max); } return 0; }