[HDU 4328] Cut the cake (悬链法)

原创 2016年06月01日 15:47:41

HDU - 4328

给定一块矩形,每个格子都是蓝色或者红色
从中切下一块矩形,使得切下的矩形内
每一个格子都是同色或者红蓝相间
求满足条件的矩阵的最大周长


第一道悬链法的题目
利用悬链法可以求不包含障碍点的极大矩阵
从而得出不包含障碍点的最大矩阵
具体可以看王知昆的论文《浅谈用极大化思想解决最大子矩形问题》
预处理出悬链底端能向左,向右,向上走的最大距离
最后答案即为 ans = max( 2*( H + L+R-1 ) )

#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 最大相同子矩阵, 悬线法

题目大意: 就是现在有一个n*m的矩阵(n , m 大致思路: 白书例题的一个小变形, 还是使用悬线法来做, 用up[i][j]表示当前位置向上能匹配到的最长长度, 用left[i][...

HDU 4328 Cut the cake(最大子矩阵+悬线法)

 题意:给定一个n*m的棋盘有红黑两色,让截取一个周长最大矩形,该矩形要么全是黑色,要么全是红色,要么黑色和红色交替。 思路:UVALive 3029 的强化版,多了一种01交替的情况,方法也...

hdu 4328 Cut the cake(最大子矩阵)2012 Multi-University Training Contest 3

Cut the cake Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T...
  • fp_hzq
  • fp_hzq
  • 2012年07月31日 19:22
  • 1298

hdu 4328 Cut the cake

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4328 题目大意:求同色最大矩形,颜色相间的最大正方形。 题目思路:这种程度的dp都没做出来,我太弱...

HDU 4328 Cut the Cake(动态规划)

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

HDU-4328-Cut the cake

昨天比赛没做出来这个题,今天看了某人的博客,转至去看了悬线,然后做了下。地址:http://blog.sina.com.cn/s/blog_8d5787ed010193oz.html        ...

HDU 4328 - Cut the cake

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4328   写的很搓,耗时比较高。。。。    其实可以再优化。。。。 不过不想优化了。。。...

hud4328 - Cut the cake(垂线法)

Cut the cake Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T...

hdu 4762 Cut the Cake(高精度&概率)

Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...

hdu4762Cut the Cake(概率+大数操作(java)+C++高精度模板)

题目链接:点击打开链接 题目描述:现有一个大蛋糕,上面随机分布了n个草莓,然后将草莓切成m块,问n个草莓全在一块蛋糕上面的概率? 解题思路:仔细分析可得:C(n,1)/m^(n-1) 由于m ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[HDU 4328] Cut the cake (悬链法)
举报原因:
原因补充:

(最多只允许输入30个字)