首先,本题是一道最大子矩阵问题,且m,n较小,可以使用DP做,

与 洛谷 [P1387]最大正方形 做法相同。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN=5005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
bool ff[MAXN][MAXN];
int dp[MAXN][MAXN],n,t,ans;
int main(){
freopen("in.txt","r",stdin);
n=init();t=init();
for(int i=1;i<=t;i++){
int x=init(),y=init();
ff[y][x]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(ff[i][j]) dp[i][j]=0;
else{
dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i][j-1]))+1;
ans=max(dp[i][j],ans);
}
}
}
cout<<ans;
fclose(stdin);
return 0;
}

本题也可以使用悬线法求最大子矩阵,首先 O(n^2) 预处理,对于矩阵上的每一个点,我们可以:

1.从它向上引一条悬线,遇到边界或障碍点停止,h[i][j] 数组记录从点 (i,j) 向上的悬线长度。

2.向左延伸,遇到边界或障碍点停止,l[i][j] 数组记录从点 (i,j) 向左最大能延伸的长度。

3.向右延伸,遇到边界或障碍点停止,r[i][j] 数组记录从点 (i,j) 向右最大能延伸的长度。

但是这样是不够的, 因为,L[i][j] 和 L[i][j] 的值都各自取决于 L[i-1][j] 和 R[i-1][j]。(因为为保证成为一个矩形,L[i][j] 不能超过 L[i-1][j],R同理)

所以枚举点对 l 和 r 进行更新,对 L[i-1][j] 与 l[i][j] 取 min,r 同理。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN=1005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
int n,t,l[MAXN][MAXN],r[MAXN][MAXN],L[MAXN][MAXN],R[MAXN][MAXN],H[MAXN][MAXN],ans;
bool ff[MAXN][MAXN];
int main(){
freopen("in.txt","r",stdin);
n=init();t=init();
for(int i=1;i<=t;i++){
int x=init(),y=init();
ff[x][y]=1;
}
for(int i=1;i<=n;i++){
l[i][1]=0;
for(int j=2;j<=n;j++){
if(ff[i][j]){
l[i][j]=j;
}else l[i][j]=l[i][j-1];
}
r[i][n]=n+1;
for(int j=n-1;j>=1;j--){
if(ff[i][j]){
r[i][j]=j;
}else r[i][j]=r[i][j+1];
}
}
for(int j=1;j<=n;j++){
H[1][j]=1;L[1][j]=l[1][j];R[1][j]=r[1][j];
}
for(int i=2;i<=n;i++){
for(int j=1;j<=n;j++){
if(ff[i-1][j]){
H[i][j]=1;
L[i][j]=l[i][j],R[i][j]=r[i][j];
}else{
H[i][j]=H[i-1][j]+1;
L[i][j]=max(L[i-1][j],l[i][j]);
R[i][j]=min(R[i-1][j],r[i][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int len=min(H[i][j],R[i][j]-L[i][j]-1);
//if(len==6) printf("%d %d\n",i,j);
ans=max(ans,len);
}
}
cout<<ans;
fclose(stdin);
return 0;
}

洛谷 [P2701] 巨大的牛棚的更多相关文章

  1. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  2. 洛谷——P2701 [USACO5.3]巨大的牛棚Big Barn

    P2701 [USACO5.3]巨大的牛棚Big Barn 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他 ...

  3. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn 题解

    P2701 [USACO5.3]巨大的牛棚Big Barn 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他 ...

  4. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  5. 洛谷—— P2701 [USACO5.3]巨大的牛棚Big Barn

    https://www.luogu.org/problem/show?pid=2701 题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的 ...

  6. 洛谷P2874 [USACO07FEB]新牛棚Building A New Barn [贪心]

    题目传送门 题目描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wan ...

  7. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  8. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  9. 洛谷P2845-Switching on the Lights 开关灯

    Problem 洛谷P2845-Switching on the Lights 开关灯 Accept: 154    Submit: 499Time Limit: 1000 mSec    Memor ...

随机推荐

  1. Oil Deposits(dfs水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...

  2. as提示功能

  3. Oracle_多行函数

      Oracle_多行函数   多行函数min(),max(),count(),sum(),avg() --1.1统计公司的最高工资,最低工资和总人数 --对于null值直接略过,不做运算 --max ...

  4. move_uploaded_file

    move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_uploaded_file(file,newloc) 参数 ...

  5. JS_全

    <script src="jquery-1.9.1.js" type="text/javascript"></script> <s ...

  6. Web API <五> 序列化

    在 Asp.Net Web Api 中提供了两种 媒体类型格式化器(mime-type formatter),分别用于支持 JSON 和 XML 数据的格式化处理.默认两种格式化器已集成到了 Asp. ...

  7. Python调用外部程序——os.system()和subprocess.call

    通过os.system函数调用其他程序 预备知识:cmd中打开和关闭程序 cmd中打开程序 a.打开系统自带程序 系统自带的程序的路径一般都已加入环境变量之中,只需在cmd窗口中直接输入程序名称即可. ...

  8. Java之IO流学习总结【上】

    一.什么是流? 流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件.内存.IO设备等数据的流向. ...

  9. 【js 实践】js 实现木桶布局

    还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...

  10. apktool给软件加注册机修改图标和文件名

    功能实现,即让你的软件具有注册机功能,或者破解别人的软件,据为己有! 先反编译文件包 然后全局工具,修改图标和名称 加注册机,输入key,下载计算器,即可.给某个用户设置自定义的使用时间!