您的位置:首页 > 其它

uvaLA 3029 最大子矩阵(DP)

2014-05-28 14:22 239 查看
参见最大子矩阵的论文

注意读入数据的地方

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

int maps[1100][1100];
int N, M;
int high[1100][1100], lf[1100][1100], rt[1100][1100];

int main(){
int T, ans;
char c;

scanf( "%d", &T );
while( T-- ){

scanf( "%d%d", &N, &M );
memset( maps, 0, sizeof( maps ) );
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= M; j++ ){
while( 1 ){
c = getchar();
if( c == 'R' ){
maps[i][j] = 0;
break;
}else if( c == 'F' ){
maps[i][j] = 1;
break;
}
}
}
}

ans = 0;
memset( high, 0, sizeof( high ) );
for( int i = 1; i <= N; i++ ){
lf[i][0] = 0;
for( int j = 1; j <= M; j++ ){
if( maps[i][j] ){
lf[i][j] = lf[i][j-1] + 1;
}else{
lf[i][j] = 0;
}
}
rt[i][M+1] = 0;
for( int j = M; j >= 1; j-- ){
if( maps[i][j] ){
rt[i][j] = rt[i][j+1] + 1;
}else{
rt[i][j] = 0;
}
}
for( int j = 1; j <= M; j++ ){
if( maps[i][j] == 0 ){
high[i][j] = 0;
continue;
}else if( maps[i-1][j] == 0 ){
high[i][j] = 1;
ans = max( ans, lf[i][j] + rt[i][j] - 1 );
}else{
high[i][j] = high[i-1][j] + 1;
lf[i][j] = min( lf[i-1][j], lf[i][j] );
rt[i][j] = min( rt[i-1][j], rt[i][j] );
ans = max( ans, ( lf[i][j] + rt[i][j] - 1 ) * high[i][j] );
}
}
}

printf( "%d\n", ans * 3 );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: