UVa 108 - Maximum Sum (最大子矩阵)

来源:互联网 发布:linux tomcat启动 停止 编辑:程序博客网 时间:2024/05/17 21:43
/*************************************************************************    > File Name: 108.cpp    > Author: Toy    > Mail: ycsgldy@163.com     > Created Time: 2013年05月24日 星期五 12时56分02秒 ************************************************************************/#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <cstdlib>#include <climits>#include <sstream>#include <fstream>#include <cstdio>#include <string>#include <vector>#include <queue>#include <cmath>#include <stack>#include <map>#include <set>using namespace std;const int INF = 0x7fffffff;int Case, A[1010][1010];int max1D ( int a[] ) {int ans = -1e9;int s = 0;for ( int i = 0; i < Case; ++i ) {if ( s >= 0 ) s += a[i];else s = a[i];ans = max ( s, ans );}return ans;}int max2D ( int a[][1010] ) {  int ans = -1e9;int s[Case];for ( int i = 0; i < Case; ++i ) {memset ( s, 0, sizeof ( s ) );for ( int j = i; j < Case; ++j ) {for ( int k = 0; k < Case; ++k ) s[k] += a[j][k];ans = max ( ans, max1D ( s ) );}}return ans;}int main ( ) {while ( scanf ( "%d", &Case ) == 1 ) {for ( int i = 0; i < Case; ++i ) for ( int j = 0; j < Case; ++j ) scanf ( "%d", &A[i][j] );printf ( "%d\n", max2D ( A ) );}    return 0;}