P4147 玉蟾宫(悬线法求最大子矩阵)
2024-09-07 00:20:48
悬线法 ,\(l_{i,j},r_{i,j},up_{i,j}\) 分别表示 \((i,j)\) 这个点向左,右,上能到达的远点。然后面积就很好办了。具体实现见代码。
然而,还有更优秀的算法,可是我还没学会嘤嘤嘤,可以看看这题:P1578 奶牛浴场
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N],l[N][N],r[N][N],n,m,mp[N][N],ans;
int rd()
{
#define gc() getchar()
char c=gc();
while(c!='R'&&c!='F')c=gc();
return c=='F'?1:0;
}
int max(const int &a,const int &b){return a>b?a:b;}
int min(const int &a,const int &b){return a<b?a:b;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
mp[i][j]=rd(),l[i][j]=r[i][j]=j,a[i][j]=1;
for(int i=1;i<=n;++i)
for(int j=2;j<=m;++j)
if(mp[i][j]&&mp[i][j-1])
l[i][j]=l[i][j-1];
for(int i=1;i<=n;++i)
for(int j=m-1;j>=1;--j)
if(mp[i][j]&&mp[i][j+1])
r[i][j]=r[i][j+1];
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(i>1&&mp[i][j]&&mp[i-1][j])
{
a[i][j]=a[i-1][j]+1;
l[i][j]=max(l[i][j],l[i-1][j]);
r[i][j]=min(r[i][j],r[i-1][j]);
}
ans=max(ans,(r[i][j]-l[i][j]+1)*a[i][j]);
}
}
printf("%d\n",ans*3);
return 0;
}
最新文章
- obj转json
- flask 使用 SQLAlchemy 的两种方式
- 软工实践练习——使用git进行代码管理心得
- 华为2013校招之哈工大威海 上机试题之一:报数问题:设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报 数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去直 到所有的人都出圈为止。现要打印出出圈次序。
- Android开发之权限列表
- Codeforces Round #239 (Div. 2) C. Triangle
- 推送消息实现icon角标的动态显示
- Eclipse 项目有红感叹号、小红叉
- lc面试准备:Power of Two
- (二)CSS3应用 - 实现圆角
- 13.hibernate的native sql查询(转自xiaoluo501395377)
- C#创建datatable (转)
- flex 布局 实现电商网页菜单的多级分类展示
- SQL 的约束
- linux: 安装jdk(java)
- hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法
- 【文文殿下】 [SDOI2013]保护出题人 题解
- Git-根据tag创建分支
- 浏览器根对象window之事件
- PowerDesigner中翻转生成PDM图时把Name属性变成注释(转)