题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2228

题意:给出一个只含有NP两种字母的长方体。从中找出只含有字母N的长方体,造型为a*a*b,即必须有两个正方形的底。在此基础上使得a*b最大?

思路:首先对于p*q*r的长方体,可以枚举a*a这个面在p*q、p*r、q*r。不妨现在假设a*a在q*r这个面上。那么对于p个面,我们用f[i][j][k]表示在第i个面上,以(j,k)为右下角的最大正方形的边长。之后,对于p个面的每个(j,k)位置,就好比是给出一个数列,找到一个区间[L,R],使得区间最小值与区间长度之积最大。

int p,q,r,f[N][N][N];
char s[N][N][N],s1[N][N][N];

int cal(int a[],int n)
{
    int left[N],right[N],ans=0,i;
    a[0]=a[n+1]=-1;
    FOR1(i,n) left[i]=right[i]=i;
    FOR1(i,n)
    {
        while(a[i]<=a[left[i]-1]) left[i]=left[left[i]-1];
    }
    FORL1(i,n) 
    {
        while(a[i]<=a[right[i]+1]) right[i]=right[right[i]+1];
    }
    FOR1(i,n) upMax(ans,(right[i]-left[i]+1)*a[i]);
    return ans;
}

int cal(int p,int q,int r,char s[N][N][N])
{
    int i,j,k;
    int ans=0;
    FOR1(i,p)
    {
        FOR1(j,q) FOR1(k,r) 
        {
            if(s[i][j][k]=='P') f[i][j][k]=0;
            else 
            {
                f[i][j][k]=min(f[i][j-1][k],f[i][j][k-1]);
                f[i][j][k]=min(f[i][j][k],f[i][j-1][k-1]);
                f[i][j][k]++;
            }
        }
    }
    int a[N];
    FOR1(j,q) FOR1(k,r) 
    {
        FOR1(i,p) a[i]=f[i][j][k];
        upMax(ans,cal(a,p));
    }
    return ans;
}

int main()
{
    RD(q,p,r);
    int i,j,k,ans=0;
    FOR1(i,p) FOR1(j,q) RD(s[i][j]+1);
    upMax(ans,cal(p,q,r,s));
    FOR1(j,q) FOR1(i,p) FOR1(k,r) s1[j][i][k]=s[i][j][k];
    upMax(ans,cal(q,p,r,s1));
    FOR1(k,r) FOR1(i,p) FOR1(j,q) s1[k][i][j]=s[i][j][k];
    upMax(ans,cal(r,p,q,s1));
    PR(ans<<2);
}

BZOJ 2228 礼物(gift)(最大子长方体)的更多相关文章

  1. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

  2. 【降维解法:最大字段和->最大子矩阵和->最终版最大子长方体和】【UVA10755】Garbage Heap

    突然感觉刷完这一套专题后 码力有了质的飞跃,fighting 努力会有结果! 最大字段和是一个很经典的问题 O(n)算法 而对于最大子矩阵和 可以思考一个这样的想法 枚举上下边界i,j把i到j这一段的 ...

  3. bzoj 4827 礼物

    bzoj 4827 礼物 可以看做将其中一个数列(假定为 \(a\) )都加上 \(c\) , \(c\) 可以为负数.易知这里 \(-m\leq c\leq m\). 记要求的答案为 \(ans\) ...

  4. BZOJ 2142: 礼物 [Lucas定理]

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1294  Solved: 534[Submit][Status][Discuss] ...

  5. BZOJ 2142 礼物 组合数学 CRT 中国剩余定理

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1450  Solved: 593[Submit][Status][Discuss] ...

  6. 【刷题】BZOJ 2142 礼物

    Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...

  7. 礼物gift(DP)

    这道题的DP非常的有意思…… 一开始我们总是会以为这是一个背包问题,直接dp[0] = 0,dp[j] += dp[j-c[i]]进行转移.之后统计一下从dp[m-minn]~dp[m]的答案之和为结 ...

  8. bzoj 2142: 礼物【中国剩余定理+组合数学】

    参考:http://blog.csdn.net/wzq_qwq/article/details/46709471 首先推组合数,设sum为每个人礼物数的和,那么答案为 \[ ( C_{n}^{sum} ...

  9. bzoj2228[ZJOI2011]礼物(gift)

    据说联赛之前写题解可以涨RP 这题的输入格式半天没看懂-其实是有q层摞在一起,每一层大小都是p*r,依次输入q层的情况.那么首先我们枚举三种挖方块的姿势,分别使切出的方块的上面/前面/右面是正方形的面 ...

随机推荐

  1. [错误代码:0x80070002]IIS7及以上伪静态报错404

    故障现象:DTCMS开启伪静态功能,VS2010预览正常,发布到IIS后报错404.0错误 (WIN7,WIN8,SERVER2008).模块IISWebCore通知MapRequestHandler ...

  2. JS模板引擎 :ArtTemplate (2)

    上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...

  3. 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio

    最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...

  4. 亚马逊 在线测试题目 amazon (变种的)三叉树的最近公共祖先问题

    题目意思就是找一棵按上面链接所示的树对应的上面的两个点的最小公共祖先(LCP,Least Common Father),按照比较大小来依次返回自己的父亲节点就行了.具体看代码:getfather(a) ...

  5. NGUI 自定义 Drag Item Script

    最近要实现一个NGUI效果. 查看了一下,NGUI有个自带 UIDragDropItem.cs 的组件进过修改后即可以实现. 下面贴上UI布局,代码: mDragDropItem.cs using U ...

  6. Unity--截取屏幕任意区域

    原地址:http://blog.csdn.net/tanmengwen/article/details/8501612 void Update () { if(Input.GetKeyDown(Key ...

  7. BeanUtils No value specified for Date的解决方法

    /** * ConversionException: No value specified for Date的解决方法 */ ConvertUtils.register(new DateConvert ...

  8. Action Bar详解

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  9. 《Thinking in C++》学习笔记(二)【第三章】

    第三章 C++中的C 3.4.4 指针简介 ‘&’运算符:只要在标识符前加上‘&’,就会得出标识符的地址. C和C++有一个专门存放地址的变量类型.这个变量类型叫做指针(pointer ...

  10. cellspacing与cellpadding

    此文引用自cellpadding和cellspacing属性来控制表格边框的间距. 作者:nestea 巢(cell) -- 表格的内容 巢补白(表格填充)(cellpadding) -- 代表巢外面 ...