프로그래밍의 아름다움 - 하위 그룹의 합계 최대값 (2차원)

폭력적인 매거 방법을 피하고 우리는 1차원 수조의 구법을 참고한다. 1차원 해답은 재선형 시간 안에 완성할 수 있고 구체적으로는 나의 프로그래밍 주옥 독서 노트를 참고할 수 있다.
우리는 문제를 2차원에서 1차원으로 바꾸었다. 현재 우리는 행렬의 상하 경계를 매거한 다음에 1차원의 방법으로 좌우 경계를 확정한다. 시간의 복잡도는 O (N^2*M) 이다.
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=505;
int matrix[maxn][maxn];
int ps[maxn][maxn];			//    
int maxnum=-0xfffff;
int mmax(int a,int b)
{
	return a>b?a:b;
}
int BC(int row,int col,int m)  // row   col     m        
{
	return ps[col][m]-ps[row-1][m]-ps[col][m-1]+ps[row-1][m-1];
	
}
int maxsum(int matrix[maxn][maxn],int n,int m)
{
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++)
		{
			int maxendinghere=0,maxsofar=0; //           
			for(int k=1;k<=m;k++)           
			{
				maxendinghere=mmax(maxendinghere+BC(i,j,k),0);
				maxsofar=mmax(maxsofar,maxendinghere);
			}
			if(maxsofar>maxnum)maxnum=maxsofar;
		}
		return maxnum;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>matrix[i][j];
	memset(ps,0,sizeof(ps));
	for(int i=1;i<=n;i++)     //        ,   O(1)      BC() 
		for(int j=1;j<=m;j++)
			ps[i][j]=ps[i-1][j]+ps[i][j-1]-ps[i-1][j-1]+matrix[i][j];
	cout<<maxsum(matrix,n,m)<<endl;
	return 0;		
					
} 

좋은 웹페이지 즐겨찾기