同机房大佬也写了这题的 题解.

通解分析

此类问题我通常喜欢归纳成一类,即阻碍联通的坐标DP.

既然是阻碍联通,那么此类问题的通用思路是这样的:

首先将dp数组图形化. 一般用一个特定图形上的特定点来标识整个图形. 比如假如我需要找正方形的最大面积,我可以用左下角坐标来表示整个正方形. 找三角形最大面积,我可以用最上方顶点来表示整个三角形. 但这个标识一定要是确定的,假如我只用 顶点 来表示三角形,那么可表示的就太多了.

既然是坐标,那么我们一般使用一个二维dp数组. 数组里存放的是这个图形的相关信息,使得我们能完全确定这个图形,比如边长等.

随后,我们根据图形的特殊性,构造出一种用周围坐标推出当前坐标的状态转移方程.

我们来看一下具体的实例.

问题处理

对于这个题。依据上面的思路,我们定义一个二维数组 \(f[i][j]\) ,其中 \((i,j)\) 为正方形左下角的坐标, \(f[i][j]\) 中存储正方形的最大边长.

接下来我们这样初始化:令未损坏的坐标的最大边长都为 \(1\) ,其正确性不必证明.

然后进行状态转移方程的推理.

我们先来看从 \(1\) 如何变成 \(2\),这很容易想,因为我们定义的是正方形左下角的坐标,想要让这个坐标上的正方形边长为 \(2\) ,只需要在 \(1\) 的基础上,判断其右方,上方,右上方的三个格子是不是 \(1\) 即可.

接下来看如何从 \(2\) 变成 \(3\).

1 0 1 1
1 1 1 0
1 1 1 1
1 1 1 1

这是一块 \(4 \times 4\) 大小的地块. 对它进行一次 \(1\) 变成 \(2\) 的操作,使它变成这样:

1 0 1 1
1 1 1 0
2 2 1 1
2 2 2 1

注意到最左下角可以变为3,而它的右方,上方,右上方的三个格子都为2.

如此尝试几次,我们得出结论:一个格子右方,上方,右上方的三个格子都不小于 \(n\) 时,该格子为 \(n+1\).

所以有状态转移方程:

\[f[i][j]=min \begin{cases} f[i-1][j]\\f[i][j+1]\\f[i-1][j+1] \end{cases} +1
\]

因为每一次更新都要在上一数字的基础上,所以状态转移方程需要遍历 \(k\) 次(其中 \(k\) 是最大正方形边长,一般来说是 \(min(m,n)\) )

因此,该程序的时间复杂度为 \(O(nm·min(m,n))\),近似于 \(n^{3}\) .

但是这题 \(n=1000\) 的时候必炸,所以我们要想办法优化一下.

注意到,假如我们从右上角开始遍历,那么更新左下角正方形需要的所有正方形都会在它之前被更新,因此我们这样遍历只需要更新一次. 时间复杂度为 \(O(mn)\).

代码实现

点击查看代码
	cin>>n>>m;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>f[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=m;j>=1;--j){
if(f[i][j]){
f[i][j]=min({f[i-1][j],f[i][j+1],f[i-1][j+1]})+1;
ans=max(ans,f[i][j]);
}
}
}
cout<<ans;

[TK] 盖房子 hzoi-tg#262的更多相关文章

  1. tyvj1189 盖房子

    描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的.但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些瑕 ...

  2. 【动态规划】盖房子(house)--未提交--已提交

    问题 D: 盖房子(house) 时间限制: 1 Sec  内存限制: 64 MB提交: 27  解决: 16[提交][状态][讨论版] 题目描述 FJ最近得到了面积为n*m的一大块土地,他想在这块土 ...

  3. 盖房子(house)

    盖房子(house) 题目描述 FJ最近得到了面积为n*m的一大块土地,他想在这块土地上建造一所房子,这个房子必须膏形的.但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些瑕疵十 ...

  4. vijos 1057 盖房子 简单DP

    描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这些 ...

  5. vijos 1057 盖房子 dp 最大子正方形

    P1057盖房子 未递交 标签:[显示标签] 描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美 ...

  6. Vijos 1057 盖房子

    二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), ...

  7. 今儿直白的用盖房子为例,给你讲讲Java建造者模式

    摘要:建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...

  8. 模拟赛01 T3 盖房子

    题面 http://zhengruioi.com/problem/248 题解 三重容斥(说是两重也行吧) 我们来看题目的约束 ①有k个位置不能放(k≤8) ②每行每列至少一个 ③正负对角线至少一个 ...

  9. Vijos1057 盖房子(DP经典题)

    之前没有怎么刷过dp的题,所以在此学习了~(感谢walala大神的思路,给了我很大的启发) 也算是自己学习的另一种dp题型吧 先贴上状态转移方程: if(a[i][j]) f[i][j]=min(f[ ...

  10. ECNU 2018 10月月赛 E 盖房子 (bitset + 倍增)

    题目链接  ECNU Monthly 2018.10 Problem E 从开场写到结束…… 显然要把三角形分成上下两部分. 把每一部分分成三部分,以上部分为例. 上面和右边,以及左下角的正方形. 也 ...

随机推荐

  1. Java 基于Hutool实现DES加解密

    POM.XML配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  2. Vue 使用Use、prototype自定义全局插件

    Vue 使用Use.prototype自定义全局插件   by:授客 QQ:1033553122   开发环境   Win 10   node-v10.15.3-x64.msi 下载地址: https ...

  3. 后端报错记录:406/实体类getset缺失

    报错为406:org.springframework.web.HttpMediaTypeNotAcceptableException 报错历程:在使用后端写neo4j的实体的时候忘记写@Data(没有 ...

  4. SEO初学者指南之什么是SEO

    前言 Hi,大家好,我是听风.欢迎来到SEO基础入门指南.在这个博客中主要教大家SEO的基础知识,以谷歌SEO为主,重点放在实操方面. 虽然是基础入门教程,但我希望朋友们不要对"初学者&qu ...

  5. CSP-S提高组数据结构算法模板大合集

    CSP-S 算法总结 2.2.1 基础知识与编程环境 无 2.2.2 C++ 程序设计 2 set/nultiset map/multimap deque/priority_queue STL 2.2 ...

  6. MindSpore分布式并行训练 (GPU-Docker)mindspore—1.2.1—gpu—docker版本运行报错,Failed to init nccl communicator for group,init nccl communicator for group nccl_world_group

    如题目所述: 计算框架MindSpore分布式并行训练报错,具体版本:docker-gpu-1.2.1 运行环境: 硬件:Intel CPU, 4卡泰坦 软件:Ubuntu18.04宿主机,docke ...

  7. 拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践

    作者|云科NearFar X Lab团队 左益.周志银.洪守伟.陈超.武超 一.导读 无锡拈花云科技服务有限公司(以下简称:拈花云科)是由拈花湾文旅和北京滴普科技共同孵化的文旅目的地数智化服务商.20 ...

  8. MySQL手动执行rollback,内部实现分析

    -- 测试手动回滚操作 -- 1手动开启事务 START TRANSACTION -- 2执行更新操作语句 UPDATE FraBakNtuAnalysize SET IsDeleted = 0 WH ...

  9. CH02_数据类型

    CH02_数据类型 数据类型 整型 描述:整型变量表示的是整型类型的数据,C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同. 数据类型 占用空间 取值范围 short(短整型) 2字 ...

  10. 【牛客刷题】HJ4 字符串分隔

    题目链接 这个题目本身基本上是对语言熟悉程度的考察,没有什么别的逻辑可言: package main import ( "fmt" "strings" ) fu ...