题目大意

给出一个 \(n \times m \ (1 \leq n, \ m \leq 2500)\) 的 \(01\) 矩阵,让你在其中找到一个最大的子矩阵使得该子矩阵除了一条对角线上的数字均为 \(1\) 之外,其他数字均为 \(0\) 。

思路

Level 1

暴力枚举每一个子矩阵,然后判断该矩阵是否为正方形且满足要求。

时间复杂度十分可观地达到了 $ O(n^3 m^3) ≈ O(n^6)$

Level 1.5

可以在 Level 1 的基础上,在枚举的时候就保证构造了正方形,时间复杂度 $ O(nm \times min(n, m)^3) ≈ O(n^5)$

Level 2

可以用 $ DP $ ,这里给出正方形的 \(1\) 对角线是从左下角到右上角的情况(例如:

如果能够继承右上角的方格,那么 \(f[i][j] = f[i - 1][j + 1] + 1\)

否则,可以 \(O(n)\) 枚举一下可以继承多少。

最坏时间复杂度 \(O(n^3)\),调的好可以过此题。

Level 2.5

可以用前缀和优化,在判断能够继承多少的时候用二分,最坏时间复杂度 \(O(n^2 log_{{ }_2}n)\),基本上可以过此题。

Level 3

<-- 正解警告 -->

预处理出每个格子最多可以向左,向上,向右延伸多少个格子,使这些格子中的数都是 \(0\) (不包括这个格子)

然后对于每个格子,尝试以这个格子为左下角(右下角)建立一个子矩阵,不行就继承上一次 \(DP\) 的结果。

\(f[i][j]\) 表示以 \(i, \ j\) 为左下角(右下角)建立的子矩阵的大小。

(在实际实现的时候,两次 \(DP\) 的结果被我放在了同一个数组里面)

Code

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#define Max_N 103
using namespace std; template <typename Int>
Int read() {
char ch = getchar();
while (!isdigit(ch)) ch = getchar();
Int a = (ch & 15);
ch = getchar();
while (isdigit(ch)) {
a = (a + (a << 2) << 1) + (ch & 15);
ch = getchar();
}
return a;
} int n, m, a[2503][2503];
int lef[2503][2503] = {0}, upp[2503][2503] = {0}, rig[2503][2503] = {0};
int f[2503][2503] = {0}; int main()
{
n = read<int>();
m = read<int>();
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= m; j++) {
a[i][j] = read<int>();
if (!a[i][j]) {
lef[i][j] = lef[i][j - 1] + 1;
upp[i][j] = upp[i - 1][j] + 1;
}
}
}
for (register int i = 1; i <= n; i++) {
for (register int j = m; j >= 1; j--) {
if (!a[i][j]) {
rig[i][j] = rig[i][j + 1] + 1;
}
}
}
register int ans = 0;
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= m; j++) if (a[i][j]) {
f[i][j] = min(min(lef[i][j - 1], upp[i - 1][j]),
f[i - 1][j - 1]) + 1;
if (f[i][j] > ans) ans = f[i][j];
}
}
memset(f, 0, sizeof(f));
for (register int i = 1; i <= n; i++) {
for (register int j = m; j >= 1; j--) if (a[i][j]) {
f[i][j] = min(min(rig[i][j + 1], upp[i - 1][j]),
f[i - 1][j + 1]) + 1;
if (f[i][j] > ans) ans = f[i][j];
}
}
printf("%d", ans);
return 0;
}

最后,祝你们好运!

洛谷 题解 P1736 【创意吃鱼法】的更多相关文章

  1. P1387 最大正方形&&P1736 创意吃鱼法

    P1387 最大正方形 P1736 创意吃鱼法 两道类似的$DP$ 转移方程基本上类似于$f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))$ 考虑构成 ...

  2. 洛谷 P1736 创意吃鱼法

    题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...

  3. 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  4. 洛谷P1736 创意吃鱼法 dp

    正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...

  5. 洛谷 P1736 创意吃鱼法(多维DP)

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  6. 洛谷P1736 创意吃鱼法

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  7. P1387 最大正方形 && P1736 创意吃鱼法(DP)

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  8. P1736 创意吃鱼法 图的DP

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  9. P1736 创意吃鱼法

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  10. P1736 创意吃鱼法80

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

随机推荐

  1. JVM原理速记复习Java虚拟机总结思维导图面试必备

    良心制作,右键另存为保存 喜欢可以点个赞哦 Java虚拟机 一.运行时数据区域 线程私有 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是Native方法则为空),是唯一一个没有规定 ...

  2. 浅谈oracle中for update 和 for update nowait 和 for update wait x的区别

    在执行update的时候,不加nowait/wait x的时候,当数据记录被锁住的时候,会一直处于等待状态,直到资源锁定被释放: 而加了nowait的时候,马上就会进行反馈“ORA-00054错误,内 ...

  3. setState何时同步,何时异步,为什么?

    setState何时同步,何时异步,为什么 答案:在React库控制时,异步:否则同步. 示例代码如下: constructor(props){ super(porps); this.state = ...

  4. django post请求

    django中提交post请求时候,需要携带CSRF,否则会报403错误,此时需要在form中添加{% csrf_token %} 或者注释掉settings.py -> MIDDLEWARE ...

  5. AppBoxFuture: 集成第三方Sql数据库

      框架设计之初是不准备支持第三方数据库的,但最近几个朋友都提到需要将旧的基于传统Sql数据库的应用迁移到框架内,主要是考虑到一方面目前框架内置的分布式数据库尚未完善,另一方面是希望能逐步迭代旧应用替 ...

  6. pyinstaller打包python文件成exe(原理.安装.问题)

    py文件打包成exe文件的方式一共有三种:py2exe.PyInstaller和cx_Freeze 本文分四个步骤来详讲如何用PyInstaller将py文件打包成exe文件 1. PyInstall ...

  7. 2019-9-25:渗透测试,基础学习,medusa爆破学习

    Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...

  8. Netty学习篇⑥--ByteBuf源码分析

    什么是ByteBuf? ByteBuf在Netty中充当着非常重要的角色:它是在数据传输中负责装载字节数据的一个容器;其内部结构和数组类似,初始化默认长度为256,默认最大长度为Integer.MAX ...

  9. 【Luogu P2002&P2341】消息扩散/受欢迎的奶牛

    Luogu P2002 Luogu P2341 使用强连通分量算法缩点 第一题统计入度为0的个数强连通分量数. 第二题的答案为当且仅当仅有一个强连通分量的出度为0时该强连通分量的节点数,原因如下:若一 ...

  10. requests请求库练习--GitHub登录

    # coding = utf-8 """ 结合抓包工具,采用两种方法模拟登录github直接利用session登录和利用requests登录 ""&q ...