洛谷 题解 P1736 【创意吃鱼法】
题目大意
给出一个 \(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 【创意吃鱼法】的更多相关文章
- P1387 最大正方形&&P1736 创意吃鱼法
P1387 最大正方形 P1736 创意吃鱼法 两道类似的$DP$ 转移方程基本上类似于$f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))$ 考虑构成 ...
- 洛谷 P1736 创意吃鱼法
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...
- 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
- 洛谷 P1736 创意吃鱼法(多维DP)
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- P1387 最大正方形 && P1736 创意吃鱼法(DP)
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- P1736 创意吃鱼法 图的DP
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- P1736 创意吃鱼法80
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
随机推荐
- .NET进阶篇06-async异步、thread多线程2
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.线程Thread1.生命周期2.后台线程3.静态方法1.线程本地存储2.内存栅栏4.返回值二.线程池ThreadPool1.工作队 ...
- 014.Kubernetes二进制部署docker
一 部署docker 1.1 部署docker组件 docker 运行和管理容器,kubelet 通过 Container Runtime Interface (CRI) 与它进行交互. 1.2 下载 ...
- Class文件结构全面解析(上)
什么是Class文件? 在Java刚刚诞生的时候就提出了一个非常著名的口号:"一次编写,到处运行.(Write Once,Run Anywhere)".为了实现平台无关性,各种不同 ...
- W与V模型的联系与区别
很多小白一定要注意: 看准那个是开发的工作哪个是测试的工作,不要弄混了!!! 软件测试的V模型 以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 ...
- nyoj 8-一种排序 (贪心)
8-一种排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:9 submit:18 题目描述: 现在有很多长方形,每一个长方形都有一个编号,这个编号 ...
- nyoj 76-超级台阶 (递推)
76-超级台阶 内存限制:64MB 时间限制:1000ms 特判: No 通过数:8 提交数:12 难度:3 题目描述: 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共 ...
- nyoj 122-Triangular Sums (数学之读懂求和公式的迭代)
122-Triangular Sums 内存限制:64MB 时间限制:3000ms 特判: No 通过数:5 提交数:7 难度:2 题目描述: The nth Triangular number, T ...
- Spring boot 加入shiro支持
在项目添加依赖 <!-- shiro spring. --> <dependency> <groupId>org.apache.shiro</groupId& ...
- 【Java】面向对象之封装
面向对象编程是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问.要访问该类的数据,必须通过指定的方式 ...
- 四 linuk常用命令 2. 权限管理命令
一 权限管理命令chmod 所有者u 所属组g 其他人o 所有人a 所有者和root超级用户可以更改该权限 普通更改权限是不会改变子目录的权限的,要想改变用递归修改 useradd增加用户 目录的r和 ...