2132. 用邮票贴满网格图 (困难,二维前缀和,二维差分)

2023-12-14 17:05

本文主要是介绍2132. 用邮票贴满网格图 (困难,二维前缀和,二维差分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

  1. 通过二维前缀和,我们可以快速判断以 i,j 为右下顶点是否能贴邮票,其递推关系为在这里插入图片描述
  2. 即 sum(i, j) 为0就表示以 i,j 为右下顶点能贴邮票,也就是以 i - stampHeight + 1,j - stampWidth + 1的顶点为左上角能够贴邮票
  3. 然后判断是否贴满,设diff数组,其递归关系为(在第四步之后,遍历矩阵,用sum来贴邮票的同时,根据下式来判断每个点是否被贴上,因为我们只贴左上角,所以这么同时做是可行的):在这里插入图片描述
  4. 由下图可以看到,更新sum数组的同时更新diff,当在 i, j 位置贴邮票时,接下来的邮票覆盖范围内应当diff全为大于0的数表示被邮票覆盖了,而抽超出邮票范围的绿色区域就该-1来保证蓝色邮票覆盖范围的有限性,同样的黄色区域的加1是为了平衡两个-1,使得总和为0
    在这里插入图片描述
class Solution:def possibleToStamp(self, grid: List[List[int]], stampHeight: int, stampWidth: int) -> bool:m, n = len(grid), len(grid[0])psum = [[0] * (n + 2) for _ in range(m + 2)]diff = [[0] * (n + 2) for _ in range(m + 2)]for i in range(1, m + 1):for j in range(1, n + 1):psum[i][j] = psum[i - 1][j] + psum[i][j - 1] - psum[i - 1][j - 1] + grid[i - 1][j - 1]for i in range(1, m + 2 - stampHeight):for j in range(1, n + 2 - stampWidth):x = i + stampHeight - 1y = j + stampWidth - 1if psum[x][y] - psum[x][j - 1] - psum[i - 1][y] + psum[i - 1][j - 1] == 0:diff[i][j] += 1diff[i][y + 1] -= 1diff[x + 1][j] -= 1diff[x + 1][y + 1] += 1for i in range(1, m + 1):for j in range(1, n + 1):diff[i][j] += diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1]if diff[i][j] == 0 and grid[i - 1][j - 1] == 0:return Falsereturn True

这篇关于2132. 用邮票贴满网格图 (困难,二维前缀和,二维差分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493338

相关文章

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include