# [HDU 4328] Cut the cake （悬链法）

### HDU - 4328

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))

const int maxn=1e3+10;
int N,M;
char Map[maxn][maxn];
int L[3][maxn][maxn], R[3][maxn][maxn];
int H[3][maxn][maxn];

int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif

int T;
scanf("%d", &T);
for(int ck=1; ck<=T; ck++)
{
CLR(L); CLR(R); CLR(H);
CLR(Map);
int ans=4;
scanf("%d%d", &N, &M);
for(int i=1; i<=N; i++)
{
scanf(" %s", Map[i]+1);
for(int j=1; j<=M; j++)
{
L[0][i][j] = L[0][i][j-1] + 1;
if( Map[i][j] != 'R' ) L[0][i][j] = 0;

L[1][i][j] = L[1][i][j-1] + 1;
if( Map[i][j] != 'B' ) L[1][i][j] = 0;

L[2][i][j] = L[2][i][j-1] + 1;
if( Map[i][j] == Map[i][j-1]) L[2][i][j] = 1;
}
for(int j=M; j>=1; j--)
{
R[0][i][j] = R[0][i][j+1] + 1;
if( Map[i][j] != 'R' ) R[0][i][j] = 0;

R[1][i][j] = R[1][i][j+1] + 1;
if( Map[i][j] != 'B' ) R[1][i][j] = 0;

R[2][i][j] = R[2][i][j+1] + 1;
if( Map[i][j] == Map[i][j+1]) R[2][i][j] = 1;
}
for(int j=1; j<=M; j++)
{
H[0][i][j] = H[0][i-1][j] + 1;
H[1][i][j] = H[1][i-1][j] + 1;
H[2][i][j] = H[2][i-1][j] + 1;

if( Map[i][j] != 'R' ) H[0][i][j] = 0;
if( Map[i][j] != 'B' ) H[1][i][j] = 0;
if( Map[i-1][j] == Map[i][j]) H[2][i][j] = 1;

if( Map[i-1][j] == 'R' ) L[0][i][j] = min( L[0][i][j], L[0][i-1][j]);
if( Map[i-1][j] == 'B' ) L[1][i][j] = min( L[1][i][j], L[1][i-1][j]);
if( i>1 && Map[i-1][j] != Map[i][j] ) L[2][i][j] = min( L[2][i][j], L[2][i-1][j]);

if( Map[i-1][j] == 'R' ) R[0][i][j] = min( R[0][i][j], R[0][i-1][j]);
if( Map[i-1][j] == 'B' ) R[1][i][j] = min( R[1][i][j], R[1][i-1][j]);
if( i>1 && Map[i-1][j] != Map[i][j] ) R[2][i][j] = min( R[2][i][j], R[2][i-1][j]);

ans = max(ans, 2*(H[0][i][j] + L[0][i][j]+R[0][i][j]-1 ));
ans = max(ans, 2*(H[1][i][j] + L[1][i][j]+R[1][i][j]-1 ));
ans = max(ans, 2*(H[2][i][j] + L[2][i][j]+R[2][i][j]-1 ));

//              printf("i:%d j:%d H:%d L:%d R:%d\n", i, j, H[1][i][j], L[1][i][j], R[1][i][j]);
}
}

printf("Case #%d: %d\n", ck, ans);
}
return 0;
}


• 本文已收录于以下专栏：

## HDU 4328 Cut the cake 最大相同子矩阵, 悬线法

• u013738743
• 2015年08月03日 22:12
• 500

## hdu 4328 最大子矩阵（DP）

• hzh_0000
• 2014年05月13日 19:41
• 414

## hdu 4328 Cut the cake

• u010697167
• 2013年10月18日 16:43
• 897

## HDU 4328 Cut the cake

Cut the cake Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot...
• qq_35776409
• 2017年03月17日 16:22
• 180

## HDU 4328 - Cut the cake

• diannaok
• 2012年07月31日 19:27
• 627

## hdu - 4328 - Cut the cake - dp

• Julyana_Lin
• 2012年10月22日 17:06
• 325

## hdu 4328 Cut the cake 最大子矩阵

• azheng51714
• 2012年08月11日 15:09
• 570

## HDU 4328 Cut the Cake（动态规划）

Problem Description Mark bought a huge cake, because his friend ray_sun’s birthday is coming. Mar...
• ahfywff
• 2012年08月02日 19:19
• 473

## HDU 4328 Cut the cake（最大子矩阵+悬线法）

﻿﻿ 题意：给定一个n*m的棋盘有红黑两色，让截取一个周长最大矩形，该矩形要么全是黑色，要么全是红色，要么黑色和红色交替。 思路：UVALive 3029 的强化版，多了一种01交替的情况，方法也...
• u014664226
• 2015年11月09日 19:00
• 328

## [概率]Cut the Cake

Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
• wu_yihao
• 2013年10月12日 11:30
• 580

举报原因： 您举报文章：[HDU 4328] Cut the cake （悬链法） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)