您的位置:首页 > 其它

UVa 836 - Largest Submatrix ( 最大01矩阵)

2013-05-24 20:29 477 查看
求所有连续1的最大和。

/*************************************************************************
> File Name: 836.cpp
> Author: Toy
> Mail: ycsgldy@163.com
> Created Time: 2013年05月24日 星期五 13时34分16秒
************************************************************************/

#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, cnt, len, A[30][30];

int max1D ( int a[] ) {
int ans = -INF;
int s = 0;
for ( int i = 0; i < len; ++i ) {
if ( a[i] != 0 ) s += a[i];
else s = a[i];
ans = max ( ans, s );
}
return ans;
}

int max2D ( int a[][30] ) {
int ans = -INF;
int  s[30];
for ( int i = 0; i < len; ++i ) {
memset ( s, 0, sizeof ( s ) );
for ( int j = i; j < len; ++j ) {
for ( int k = 0; k < len; ++k ) {
if ( j == i ) s[k] += a[j][k];
else {
if ( s[k] != 0 && a[j][k] != 0 ) s[k] += a[j][k];
else s[k] = 0;
}
//	printf ( "%d ", s[k] );
}
//printf ( "\n" );
ans = max ( ans, max1D ( s ) );
}
}
return ans;
}

int main ( ) {
char str[30];
int first = 1;
scanf ( "%d", &Case );
while ( Case-- ) {
if ( first ) first = 0;
else printf ( "\n" );
len = 30;
for ( int i = 0; i < len; ++i ) {
scanf ( "%s", str );
for ( int j = 0; j < len; ++j ) A[i][j] = str[j] - '0';
len = strlen ( str );
}
printf ( "%d\n", max2D ( A ) );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: