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] + x
        self.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 + 7
    def 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):
                # 只有当至少有一个苹果时,方案才为1
                dp[row][col][0] = preSum[row][col] > 0
        
        for 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.MOD
        
        return int(dp[0][0][k - 1])

相似题目

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

1504. 统计全 1 子矩形 

85. 最大矩形 

引用资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zoho Mail企业邮箱商业扩展第1部分:入门

今天让我们来认识一下王雪琳&#xff0c;她是一位独立经营的营销咨询机构的个体企业家。在开始自己的事业之前&#xff0c;她进行了广泛的市场调研&#xff0c;明确了自己的业务定位&#xff0c;并全力以赴地投入到了自己的企业中。 一、创业背景 王雪琳的营销业务主要集中在…

新手小白做steam搬砖项目,这些内幕要了解

转眼2024年已经过去了五分之一&#xff0c;很多粉丝都在问steam搬砖项目真的假的&#xff0c;害怕项目的风险&#xff0c;担心steam搬砖项目到底能不能做&#xff0c;所以一直在犹豫和徘徊。我发现很多人想赚钱&#xff0c;但苦于找不到好的副业&#xff0c;高门槛的项目又做不…

Sealos 携手字节跳动火山引擎为帕鲁玩家送上春节福利

Sealos 携手字节跳动火山引擎为帕鲁玩家送上春节福利 游戏服务器是一个重资源业务&#xff0c;服务器成本非常之高&#xff0c;特别帕鲁服务器都 4C16G 起步&#xff0c;Sealos 与火山引擎结合实现了大幅的降本增效。 我们新起了 https://bja.sealos.run/?uide54c6ibx 专属集…

无人机在化工消防救援中的应用,消防无人机应用场景分析

火灾对社会环境具有较大影响&#xff0c;因此需要重视消防灭火救援工作&#xff0c;注重现代化技术的运用&#xff0c;将无人机应用到救援过程并保障其应用质量。无人机是一项重要技术&#xff0c;便于消防灭火救援操作&#xff0c;使救援过程灵活展开&#xff0c;排除不利影响…

@RequestBody、@RequestParam、@RequestPart使用方式和使用场景

RequestBody和RequestParam和RequestPart使用方式和使用场景 1.RequestBody2.RequestParam3.RequestPart 1.RequestBody 使用此注解接收参数时&#xff0c;适用于请求体格式为 application/json&#xff0c;只能用对象接收 2.RequestParam 接收的参数是来自HTTP 请求体 或 请…

CSS:九宫格布局

九宫格布局效果如下&#xff1a; HTML 结构&#xff1a; <div class"container"><div class"item">1</div><div class"item">2</div><div class"item">3</div><div class"item&q…

高可用 k8s 1.29 一键安装脚本, 丝滑至极

博客原文 文章目录 集群配置配置清单集群规划集群网络规划 环境初始化主机配置 配置高可用ApiServer安装 nginx安装 Keepalived 安装脚本需要魔法的脚本不需要魔法的脚本配置自动补全加入其余节点 验证集群 集群配置 配置清单 OS&#xff1a; ubuntu 20.04kubernetes&#xf…

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto.C…

【多模态大模型】GLIP:零样本学习 + 目标检测 + 视觉语言大模型

GLIP 核心思想GLIP 对比 BLIP、BLIP-2、CLIP 主要问题: 如何构建一个能够在不同任务和领域中以零样本或少样本方式无缝迁移的预训练模型&#xff1f;统一的短语定位损失语言意识的深度融合预训练数据类型的结合语义丰富数据的扩展零样本和少样本迁移学习 效果 论文&#xff1a;…

欢迎来到操作系统的世界

&#x1f31e;欢迎来到操作系统的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…

用友U8+OA doUpload.jsp 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

注意啦,MySQL8.0最新版是没有utf8选项,但是有utf8mb3和utf8mb4选项

今天在安装完MySQL最新版&#xff08;8.0.36&#xff09;&#xff0c;然后用navicat连接数据&#xff0c;创建数据库的时候&#xff0c;发现: MySQL最新版是没有utf8选项&#xff0c;但是有utf8mb3和utf8mb4选项 然后就只能卸载掉最新版&#xff0c;安装了8.0.28. &#xff08…

汽车控制臂的拓扑优化

前言 本示例使用优化模块通过减小控制臂的体积同时最大化其刚度来优化汽车控制臂的设计。 本页讨论 前言应用描述Abaqus建模方法和仿真技术文件参考 应用描述 本例说明了汽车控制臂的拓扑优化&#xff0c;在拓扑优化过程中&#xff0c;修改设计区域中单元的材料特性(有效地从…

Pycharm中以chrome打开HTML文件报错: Windows找不到文件‘Chrome‘

随笔记录 目录 1. 问题描述 2. 定位问题 3. 解决方法 3.1 获取Chrome 安装路径 3.2 修改Pycharm 中Chrome的配置 4. 校验结果 1. 问题描述 Pycharm中以chrome打开HTML文件报错&#xff1a;Windows 找不到文件chrome如图所示&#xff1a; 2. 定位问题 因为Pycharm中未设…

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…

【万题详解】洛谷P1238 走迷宫

题目 有一个 mn 格的迷宫(表示有 m 行、n 列)&#xff0c;其中有可走的也有不可走的&#xff0c;如果用 1表示可以走&#xff0c;0表示不可以走&#xff0c;文件读入这 mn 个数据和起始点、结束点&#xff08;起始点和结束点都是用两个数据来描述的&#xff0c;分别表示这个点…

Verilog刷题笔记27

题目&#xff1a; Given a 100-bit input vector [99:0], reverse its bit ordering. 解题&#xff1a; module top_module( input [99:0] in,output [99:0] out );int i;always(*)beginfor(i0;i<100;i)out[i]in[99-i];end endmodule结果正确&#xff1a;

dbeaver免费、跨平台数据管理软件

下载 dbeaver是一款的数据库连接工具&#xff0c;免费&#xff0c;跨平台。 官网&#xff1a;DBeaver Community | Free Universal Database Tool下载地址&#xff1a;Download | DBeaver Community 点击下载 安装 修改安装路径 点击安装 点击完成 使用 连接mysql 已连接 点…

C语言的循环结构

目录 前言 1.三种循环语句 1.while循环 2.for循环 2.1缺少表达式的情况 3.do while循环 2.break语句和continue语句 2.1在while循环中 2.2在for循环中 2.3在do while 循环中 3.循环的嵌套 4.go to语句 前言 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是…
最新文章