BZOJ 2228 礼物(gift)(最大子长方体)
2013-12-03 01:01
141 查看
题目链接: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
;
char s
,s1
;
int cal(int a[],int n)
{
int left
,right
,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
)
{
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
;
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);
}
题意:给出一个只含有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
;
char s
,s1
;
int cal(int a[],int n)
{
int left
,right
,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
)
{
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
;
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 [Zjoi2011]礼物(gift)
- [BZOJ2228][Zjoi2011][单调队列]礼物(gift)
- 【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黄昏下的礼物 dp转有限状态自动机+矩阵乘法优化
- BZOJ 1458: 士兵占领 最大流 题解
- BZOJ 2142 礼物
- 【二分答案】【最大流】bzoj3993 [Sdoi2015]星际战争
- BZOJ 1084 最大子矩阵 (dp)
- BZOJ 1497: [NOI2006]最大获利 最大权闭合子图
- 【BZOJ 1497】 [NOI2006]最大获利
- [bzoj1834][ZJOI2010] 网络扩容 最大流 费用流
- 【BZOJ4405】挑战NPC 带花树模板 一般图最大匹配
- 【bzoj1084】【洛谷P2331】 【SCOI2005】 最大子矩阵
- bzoj 3039 悬线法 最大子矩阵问题
- bzoj 1012: [JSOI2008]最大数maxnumber
- [bzoj1093][ZJOI2007]最大半连通子图 Tarjan,DP
- BZOJ 1057 棋盘制作(最大黑白相间子矩阵)
- bzoj 2756 [SCOI2012]奇怪的游戏【二分+最大流】
- 【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流
- BZOJ_P1412 [ZJOI2009]狼和羊的故事(网络流+最大流最小割)
- BZOJ 1143 CTSC2008 祭祀river 二分图最大匹配