题目大意

给出一个 \(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. C++中对C的扩展学习新增语法——强枚举

    枚举类型 C++中对枚举的加强: 1.C++不允许非枚举值赋值给枚举类型,不允许其他枚举类型的值赋值给当前枚举类型,而C语言中是允许的. 2.枚举值具有外层作用域,容易造成名字冲突. 3.不同类型的枚 ...

  2. [LC]35题 Search Insert Position (搜索插入位置)

    ①英文题目 Given a sorted array and a target value, return the index if the target is found. If not, retu ...

  3. 新手如何正确安装python,视图详解

    今天教新手如何安装python,因为Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的.学 ...

  4. Bootstrap中手指控制轮播图切换

    通过手指的滑动来控制轮播图中的图片内容的切换 // 1. 获取手指在轮播图元素上的一个滑动方向(左右) // 获取界面上的轮播图容器 var $carousels = $('.carousel'); ...

  5. Nginx下HTTP强制重定向至HTTPS

    Nginx下HTTP强制重定向至HTTPS 对于nginx来说,配置http强制重定向至https有多种多样的写法.可以直接rewrite,也可以用301重定向.但是直接拷贝网上的配置往往会出现问题, ...

  6. 使用runc直接运行容器

    组件containerd负责集群节点上容器的生命周期管理,并向上为docker daemon提供gRPC接口,containerd依靠runC去创建容器进程.而在容器启动之后,runC进程会退出. 可 ...

  7. PHP变量的初始化以及赋值方式介绍

    什么是变量 变量通俗的来说是一种容器.根据变量类型不同,容器的大小不一样,自然能存放的数据大小也不相同.在变量中存放的数据,我们称之为变量值. PHP 中的变量用一个美元符号后面跟变量名来表示.变量名 ...

  8. 将py文件打包为exe文件方法

    前提: pip是依赖python的,首先检查下windows机器上有没有安装python,或者有没有添加到环境变量中,如果都没有需要安装或者加入环境变量 安装pip 下载地址: https://pyp ...

  9. 【论文阅读】Clustering Convolutional Kernels to Compress Deep Neural Networks

    文章:Clustering Convolutional Kernels to Compress Deep Neural Networks 链接:http://openaccess.thecvf.com ...

  10. 《master the game of GO wtth deep neural networks and tree search》研究解读

    现在”人工智能“如此火爆的一大直接原因便是deepmind做出的阿尔法狗打败李世石,从那时开始计算机科学/人工智能成为了吹逼的主流.记得当时还是在学校晚新闻的时候看到的李世石输的消息,这个新闻都是我给 ...