题目大意

给出一个 \(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. 字符串(str)

    把字符连成串串. 在python中⽤用', ", ''', """引起来的内容被称为字符串串. 字符串是不可变的对象,所以任何操作对原字符串是不会有任何影响的 ...

  2. 用正则表达式获取URL中的查询参数

    总结获取url中查询参数的两种方式 通过正则表达式获取单个参数 url中的所有查询参数可以通过 window.location.search 字段获取,以字符串的形式返回.并有固定的格式 ?param ...

  3. hdu 1233 还是畅通工程 (prim, kruskal)

    还是畅通工程Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  4. Linq三表连接查询加分组

    1.Linq查询 2.数据库事例: 3.效果图:

  5. 【接口测试】HttpClient+fastJson 总结与案例

    多次理解,反复练习,破釜沉舟. HttpCLient是什么 Apache Jakarta Common 下的子项目 支持 HTTP 协议的客户端编程工具包 支持 HTTP 协议最新的版本 怎么利用Ht ...

  6. inventory

    1.设置主机的默认inventory mode. 2. 设置自动Populate 数据

  7. Discovery and auto register

    1.Discovery 2. auto register 2.1 agent 端配置 2.2 server 端配置

  8. react antd Table动态合并单元格

    示例数据 原始数组 const data = [ { key: '0', name: 'John Brown', age:22, address: 'New York No. 1 Lake Park' ...

  9. Win10如何快速截屏

    Win10不用QQ,如何快速截屏? 年轻的时候想截图总是需要把QQ打开,但是直到我遇到了一种尴尬的场景:就是需要我把鼠标放着标签上,才会有下一步内容出现,这就很难搞. 经过查找资料,做出一些总结. 第 ...

  10. Dart Learn Notes 01

    关于Dart的几点重要说明 在Dart中所有变量都是一个对象,所有对象都是一个类的实例.每个数字,方法,甚至是Null都是对象.所有的对吸纳更都是集成自Object这个类.(这个说法其实是很像Java ...