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.hqwc.cn/news/459129.html

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

相关文章

CS50x 2024 - Lecture 1 - C

本周学习C语言&#xff0c;重点是函数、变量、条件语句和循环。 05:11介绍了编程语言的转换过程&#xff0c;从源代码到机器码&#xff0c;以及编译器的作用。 编译器是将一种语言翻译成另一种语言的程序 09:18使用CS50.dev进行编程&#xff0c;介绍了VS Code和命令行界面的…

信钰证券:零基础入门,教你如何学习炒股技能!

股票市场是一个充满时机和风险的地方&#xff0c;不少投资者都想经过炒股来完成财富增值的方针。但炒股赚钱并不是一件十分容易的事情&#xff0c;对于新手怎样学炒股&#xff0c;信钰证券下面就为我们详细介绍一下。 股票是一种有价证券&#xff0c;其代表的是上市公司的所有…

点云——噪声(代码)

本人硕士期间研究的方向就是三维目标点云跟踪&#xff0c;对点云和跟踪有着较为深入的理解&#xff0c;但一直忙于实习未进行梳理&#xff0c;今天趁着在家休息对点云的噪声进行梳理&#xff0c;因为预处理对于点云项目是至关重要的&#xff0c;所有代码都是近期重新复现过。 这…

识别CMS指纹与WAF识别

目录 识别CMS指纹 1 什么是CMS指纹&#xff1f; 2 常见的CMS指纹 3 识别CMS指纹的方法有哪些&#xff1f; &#xff08;1&#xff09;分析HTTP响应头&#xff0c;识别CMS的特定标头。 &#xff08;2&#xff09;通过配置文件/特殊文件 &#xff08;3&#xff09;分析网站…

【MySQL】-11 MySQL 架构及优化原理

MySQL 架构及优化原理 1 MySQL逻辑架构2 MySQL逻辑架构整体分为三层 :3 MySQL查询过程MySQL 整个查询执行过程&#xff0c;总的来说分为 5 个步骤 :3.1 客户端/服务端通信协议3.2 查询缓存3.3 查询优化3.4 查询执行引擎3.5 返回结果给客户端 4 查询系统性能1 分析查询语句2 索…

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目&#xff1a;函数将str字符串中的5个数字字符串转换为整数&#xff0c;并保存在二维数组m的最后一行&#xff0c;各元素为3、-4、16、18、6。并经函数move处理后&#xff0c;运行结果如下&#xff1a; 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

Linux操作系统基础(一):操作系统概述

文章目录 操作系统概述 一、计算机分类 二、计算机组成 三、操作系统概述 四、操作系统分类 操作系统概述 一、计算机分类 计算机一般分为个人计算机&#xff08;笔记、台式机&#xff09;与 企业级服务器&#xff08;1U、2U、机柜、塔式、刀片&#xff09;两种形式。 二…

[NISACTF 2022]easyssrf

它提示我们输入 那我们输入file:///flag file:// 访问本地文件系统 它提醒我们输file:///fl4g 它提醒我们输ha1x1ux1u.php 看到代码stristr($file, “file”)当我们输入file它会提示我们输了 啥意思可以前面加个/ 也可以通过read读取 思路都是前面加/不等于flag绕过 filephp://…

基于SSM的餐厅点菜管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的餐厅点菜管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

深入解析 Spring 事务机制

当构建复杂的企业级应用程序时&#xff0c;数据一致性和可靠性是至关重要的。Spring 框架提供了强大而灵活的事务管理机制&#xff0c;成为开发者处理事务的首选工具。本文将深入探讨 Spring 事务的使用和原理&#xff0c;为大家提供全面的了解和实际应用的指导。 本文概览 首…

Python算法题集_合并两个有序链表

Python算法题集_合并两个有序链表 题21&#xff1a;合并两个有序链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【直接合并】2) 改进版一【列表合并】3) 改进版二【递归大法】 4. 最优算法 本文为Python算法题集之一的代码示例 题21&#…

使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计

1&#xff0c;大模型本地部署 视频说明地址&#xff1a; https://www.bilibili.com/video/BV1BF4m1u769/ 【创新思考】&#xff08;1&#xff09;&#xff1a;使用x86架构Nvidia消费显卡12G显存&#xff0c;搭建智能终端&#xff0c;将大模型本地化部署&#xff0c;语音交互机…