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://xiahunao.cn/news/2774322.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Bpmn-js自定义Palette元素

Bpmn-js作为一个流程编辑器&#xff0c;常规的我们可以将其划分为几个功能区域&#xff0c;每个区域对应的负责不同的功能实现&#xff0c;bpmn-js的设计给我们留下了大量的留白和可扩展区域&#xff0c;其每一部分都可进行组合拼装&#xff0c;同时也支持我们的各种不同层次需…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案&#xff0c;具有完备的集群管理能力&a…

霍金《时间简史》(A Brief History of Time)学习笔记(第四章)

Chapter 4: The Uncertainty Principle Footnote: Chapter 4. Mainly talks about Werner Heisenberg’s Uncertainty Principle. Vital principle in modern physics, concept not hard to understand——work of a genius mind. Footnote: Werner Heisenberg, German physici…

【蓝桥杯冲冲冲】Invasion of the Milkweed G

【蓝桥杯冲冲冲】Invasion of the Milkweed G 蓝桥杯备赛 | 洛谷做题打卡day30 文章目录 蓝桥杯备赛 | 洛谷做题打卡day30[USACO09OCT] Invasion of the Milkweed G题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 [USACO09OCT] Invasion of the Mi…

斯巴鲁Subaru EDI需求分析

斯巴鲁Subaru是日本运输集团斯巴鲁公司&#xff08;前身为富士重工&#xff09;的汽车制造部门&#xff0c;以性能而闻名&#xff0c;曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接&#xff0c;首先需要确…

洛谷C++简单题小练习day9—[AHOI2017]寻找探监点

day9--[AHOI2017]寻找探监点--2.7 习题概述 题目描述 一个nn 的网格图&#xff08;标号由 1,1 开始&#xff09;上有 m 个探测器&#xff0c;每个探测器有个探测半径 r &#xff0c;问这 nn 个点中有多少个点能被探测到。 输入格式 第一行 3 个整数 n,m,r。 接下来 m 行&…

解决dockor安装nginx提示missing signature key的问题

问题描述 使用dockor安装nginx拉取nginx的时候提示key丢失问题 问题定位 由于dockor版本低导致 问题解决 卸载重新安装最新版本dockor 解决步骤 1. 卸载旧版本的Docker&#xff1a; sudo yum remove docker docker-common docker-selinux docker-engine 2. 安装依赖包&am…

Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

线性时间非比较类排序之桶排序

桶排序 桶排序也叫箱排序&#xff0c;1956年便开始使用&#xff0c;它可以算是计数排序的一个改进版本。 1. 算法思想 根据元素的特性将集合拆分为多个值域&#xff0c;我们称之为桶&#xff0c;将同一值域的元素存放在同一个桶内并进行桶内排序使其处于有序状态。如果每个桶…

华为 Huawei 交换机 黑洞MAC地址的作用和配置示例

黑洞mac作用&#xff1a;某交换机上配置某个PC的mac地址为黑洞mac&#xff0c;那么这台PC发出来的包都会被交换机丢弃&#xff0c;不会被转发到网络中。 组网需求&#xff1a; 如 图 2-13 所示&#xff0c;交换机 Switch 收到一个非法用户的访问&#xff0c;非法用户的 MAC 地址…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

Java毕业设计-基于springboot的网上书店管理系统-第75期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于springboot的网上书店管理系统&#xff1a;前端thymeleaf、js、layui&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;集成书籍管理、分类管理、订单…

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…

Java学习网络编程

Java学习网络编程 大纲 网络相关概念IP地址网络协议InetAdressSocket 具体案例 1. 网络相关概念 网络 网络通信 2. IP地址 域名 3.网络协议 4. InetAdress 获得本机的名字和IP public static void main(String[] args) throws UnknownHostException {InetAddress inetA…

【数据分享】1929-2023年全球站点的逐年平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

platform tree架构下i2c应用实例(HS3003)

目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子&#xff0c;父盒子加了固定定位&#xff0c;需要子盒子上下都有要边距&#xff0c;用margin或者padding挤开时&#xff0c;会出现缝隙是子盒子背景颜色的。 测试过了&#xff0c;有些手机型号有&#xff0c;有些没有&#xff0c;微信小程序同移…

LeetCode 0993. 二叉树的堂兄弟节点:深度优先搜索(BFS)

【LetMeFly】993.二叉树的堂兄弟节点&#xff1a;深度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/cousins-in-binary-tree/ 在二叉树中&#xff0c;根节点位于深度 0 处&#xff0c;每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个…

java_error_in_pycharm.hprof文件是什么?能删除吗?

java_error_in_pycharm.hprof文件是什么&#xff1f;能删除吗&#xff1f; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;hprof格式文件介绍&#x1f333;&#x1f333;java_error_in_pycharm.hprof文件什么情况下能删除&#x1f333;&…

【Nicn的刷题日常】之有序序列合并

1.题目描述 描述 输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤&#xfffd;,&#xfffd;≤1000 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤&#xfffd;&#xfffd;&#xfffd;≤30000 0≤val≤30000 输入描述…