LeetCode1365之切披萨的方案数(相关话题:二维前缀和,动态规划)

题目描述

给你一个 rows x cols 大小的矩形披萨和一个整数 k ,矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子)。你需要切披萨 k-1 次,得到 k 块披萨并送给别人。

切披萨的每一刀,先要选择是向垂直还是水平方向切,再在矩形的边界上选一个切的位置,将披萨一分为二。如果垂直地切披萨,那么需要把左边的部分送给一个人,如果水平地切,那么需要把上面的部分送给一个人。在切完最后一刀后,需要把剩下来的一块送给最后一个人。

请你返回确保每一块披萨包含 至少 一个苹果的切披萨方案数。由于答案可能是个很大的数字,请你返回它对 10^9 + 7 取余的结果。

示例 1:

输入:pizza = ["A..","AAA","..."], k = 3
输出:3 
解释:上图展示了三种切披萨的方案。注意每一块披萨都至少包含一个苹果。

示例 2:

输入:pizza = ["A..","AA.","..."], k = 3
输出:1

示例 3:

输入:pizza = ["A..","A..","..."], k = 1
输出:1

提示:

  • 1 <= rows, cols <= 50
  • rows == pizza.length
  • cols == pizza[i].length
  • 1 <= k <= 10
  • pizza 只包含字符 'A' 和 '.' 。

解题思路

模版代码 

class MatrixSum:def __init__(self, matrix: List[List[int]]):m, n = len(matrix), len(matrix[0])preSum = [[0] * (n + 1) for _ in range(m + 1)]for i, row in enumerate(matrix):for j, x in enumerate(row):preSum[i + 1][j + 1] = preSum[i + 1][j] + preSum[i][j + 1] - preSum[i][j] + xself.preSum = preSum# 返回左上角在 (r1,c1) 右下角在 (r2-1,c2-1) 的子矩阵元素和(类似前缀和的左闭右开)def query(self, r1: int, c1: int, r2: int, c2: int) -> int:return self.preSum[r2][c2] - self.preSum[r2][c1] - self.preSum[r1][c2] + self.preSum[r1][c1]# 如果你不习惯左闭右开,也可以这样写# 返回左上角在 (r1,c1) 右下角在 (r2,c2) 的子矩阵元素和def query2(self, r1: int, c1: int, r2: int, c2: int) -> int:return self.preSum[r2 + 1][c2 + 1] - self.preSum[r2 + 1][c1] - self.preSum[r1][c2 + 1] + self.preSum[r1][c1]

 最终题解

class Solution:MOD = 10**9 + 7def ways(self, pizza: List[str], k: int) -> int:rows, cols = len(pizza), len(pizza[0])# preSum[row][col] 表示从 (row, col) 到披萨矩形右下角部分的苹果('A'字符)总数量。preSum = [[0 for _ in range(cols + 1)] for _ in range(rows + 1)]for row in range(rows - 1, -1, -1):for col in range(cols - 1, -1, -1):preSum[row][col] = preSum[row + 1][col] + preSum[row][col + 1] - preSum[row + 1][col + 1] + (pizza[row][col] == 'A')# dp[i][j][l]表示以(i, j)为左上角,到披萨右下角为止的子矩阵,# 能够通过l次切割(实际上获得l+1块披萨)的方案数。所有的切割都会发生在这个子矩阵的区域内。dp = [[[0 for _ in range(k)] for _ in range(cols)] for _ in range(rows)]# 预先填充至少有一个苹果的单块情况for row in range(rows):for col in range(cols):# 只有当至少有一个苹果时,方案才为1dp[row][col][0] = preSum[row][col] > 0for l in range(1, k): # 从1开始,0已经处理过for row in range(rows):for col in range(cols):#尝试所有水平切割的可能for x in range(row + 1, rows):  if preSum[row][col] - preSum[x][col] > 0: # 确定上半部分至少一个苹果dp[row][col][l] += dp[x][col][l-1]dp[row][col][l] %=  self.MOD#尝试所有垂直切割的可能for y in range(col + 1, cols):if preSum[row][col] - preSum[row][y] > 0: # 确定左半部分至少一个苹果# 假设我们在位置 (row, y) 处进行一个垂直切割(# 切割线位于第 y 列的右侧,因此切下的左侧区域是从第 row 行到第 y 列的子矩阵)。# 该垂直切割将披萨分割为左侧的一块(包含至少一个苹果)和右侧的一块。# 这个刚切割的左块符合我们要求的l+1块的其中一块。dp[row][col][l] += dp[row][y][l-1]dp[row][col][l] %= self.MODreturn int(dp[0][0][k - 1])

相似题目

LeetCode221之最大正方形(相关话题:动态规划,暴力求解)-CSDN博客 

1504. 统计全 1 子矩形 

85. 最大矩形 

引用资料

https://leetcode.cn/circle/discuss/UUuRex/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode开发FPGA(0)--windows平台搭建

一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese&#xff08;simplified&#xff09;中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…

MySQL篇之定位与优化MySQL慢查询

一、如何定位慢查询 1.方案一&#xff1a;开源工具 调试工具&#xff1a;Arthas。 运维工具&#xff1a;Prometheus 、Skywalking。 2.方案二&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;…

Backtrader 文档学习- Plotting -Plotting on the same axis

Backtrader 文档学习- Plotting -Plotting on the same axis 1.概述 在同一轴上绘图&#xff0c;绘图是在同一空间上绘制原始数据和稍微(随机)修改的数据&#xff0c;但不是在同一轴上。 核心代码&#xff0c;data数据正负50点。 # The filter which changes the close pri…

力扣热门100题 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路&#xff1a;&#xff08;动态规划&#xff09;代码&#xff1a; 题目链接&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回…

[day0] 借着“ai春晚”开个场

1 文思ai笔记-新的开始 今天是2024年2月29日&#xff0c;也是传统农历的除夕夜。早起在ai圈看到一个比较新奇的消息&#xff0c;ai春晚今日举办&#xff0c;竟然有一点小小的激动。这些年确实好久没看过春晚了&#xff0c;自己对于春晚的映像还停留在“白云黑土”、“今天&…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十四章&#xff1a;使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…

【51单片机】烧写教程:将代码下载到单片机中(图示&解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 这是LCD基本实验中的一部分&#xff0c;完整实验传送门如下&#xff1a;传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是…

初始web服务器(并基于idea来实现无需下载的tomcat)

前言 前面学习了对应的http协议&#xff0c;我们知道了他是在网络层进行数据传输的协议&#xff0c;负责相应数据以及接收数据的规则&#xff0c;但是在人员开发后端的时候不仅仅需要你写io流进行数据传输&#xff0c;还需要你进行对应的tcp协议来进行数据打包发送http协议-CSD…

横扫Spark之 - 22个常见的转换算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. map()2. flatMap()3. filter()4. mapPartitions()5. mapPartitionsWithIndex()6. groupBy()7. distinct()8. coalesce()9. repartition()10. sortBy()11. intersection()12.union()13.…

IT行业有哪些证书含金量高呢?

目录 引言&#xff1a; 一、 计算机网络类证书 二、 数据库管理类证书 三、 安全与信息技术管理类证书 四、 编程与开发类证书 五、 数据科学与人工智能类证书 六、结论&#xff1a; 悟已往之不谏&#xff0c;知来者犹可追 …

c#安全-nativeAOT

文章目录 前记AOT测试反序列化Emit 前记 JIT\AOT JIT编译器&#xff08;Just-in-Time Complier&#xff09;,AOT编译器&#xff08;Ahead-of-Time Complier&#xff09;。 AOT测试 首先编译一段普通代码 using System; using System.Runtime.InteropServices; namespace co…

全栈光量子计算系统公司ORCA宣布收购GXC的集成光子学部门

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1000字丨8分钟阅读 2024年1月30日&#xff0c;全栈光量子计算系统公司ORCA Computing宣布收购总部位于奥斯汀的GXC集成光子学部门。该部门主…

阿里云服务器租用价格表_2024一年_1个月_1小时收费价格表

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

Flink on k8s之historyServer

1.Flink HistoryServer用途 HistoryServer可以在Flink 作业终止运行&#xff08;Flink集群关闭&#xff09;之后&#xff0c;还可以查询已完成作业的统计信息。此外&#xff0c;它对外提供了 REST API&#xff0c;它接受 HTTP 请求并使用 JSON 数据进行响应。Flink 任务停止后&…

探索设计模式的魅力:代理模式揭秘-软件世界的“幕后黑手”

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言 一、魔法世界 1.1 定义与核心思想 1.2 静态代理 1.3 动态代理 1.4 虚拟代理 1.5 代理模式结构图 1.6 实例展示如何工作&#xff08;场景案例&#xff09; 不使用模式实现 有何问题 使用模式重构示例 二、…

SECS/GEM300需要实现哪些内容

GEM300实现设备全自动化&#xff0c;也是金南瓜已经全面支持功能&#xff0c;作为国内首家和最好的300mm标准软件。 GEM300包含E4、E5、E30、E37、E39、E40、E84、E87、E90、E94、E116等 CJob全称Conrtol Job 1. 控制设备作业的控制 2. 包括队列、开始、暂停、继续、完成等等…

STL之stack+queue的使用及其实现

STL之stackqueue的使用及其实现 1. stack&#xff0c;queue的介绍与使用1.1stack的介绍1.2stack的使用1.3queue的介绍1.4queue的使用 2.stack&#xff0c;queue的模拟实现2.1stack的模拟是实现2.2queue的模拟实现 3.总结 所属专栏&#xff1a;C“嘎嘎" 系统学习❤️ &…

SPSS基础操作:对数据按照样本观测值进行排序

在整理数据资料或者查看分析结果时&#xff0c;我们通常希望样本观测值能够按照某一变量的大小进行升序或者降序排列&#xff0c;比如我们想按照学生的学习成绩进行排序&#xff0c;按照销售额的大小对各个便利店进行排序等。以本章附带的数据4为例&#xff0c;如果要按照y4体重…

Linux探秘之旅:透彻理解路径、命令与系统概念

目录 如何远程连接 远程登录简明指南 linux区别 1.严格区分大小写 2.linux的命令返回结果判断 3.如何查看网络信息 4.关于后缀名&#xff08;Linux不关心文件后缀&#xff09; 4.1 需要记忆的后缀 5.echo命令 6.linux一切皆文件 6.1比如磁盘的文件 6.2可执行文件 …

SpringBoot配置文总结

官网配置手册 官网&#xff1a;https://spring.io/ 选择SpringBoot 选择LEARN 选择 Application Properties 配置MySQL数据库连接 针对Maven而言&#xff0c;会搜索出两个MySQL的连接驱动。 com.mysql mysql-connector-j 比较新&#xff0c;是在mysql mysql-connect…