Leetcode每日一题:1444. 切披萨的方案数(2023.8.17 C++)

news2024/12/22 18:48:40

目录

1444. 切披萨的方案数

题目描述:

实现代码与解析:

二维后缀和  + 动态规划

原理思路:


1444. 切披萨的方案数

题目描述:

        给你一个 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 Solution {
public:
    int ways(vector<string>& pizza, int k) {

        int m = pizza.size(), n = pizza[0].size(), mod = 1e9 + 7;
        vector<vector<vector<int>>> f(k, vector<vector<int>>(m, vector<int>(n)));

        vector<vector<int>> apples(m + 1, vector<int>(n + 1)); // 后缀和

        // 后缀和 与 初始化dp数组
        for (int i = m - 1; i >= 0; i--)
        {
            for (int j = n - 1; j >= 0; j--)
            {
                apples[i][j] = apples[i + 1][j] + apples[i][j + 1] - apples[i + 1][j + 1] + (pizza[i][j] == 'A');
                f[0][i][j] = apples[i][j] > 0;
            }
        } 

        for (int kk = 1; kk < k; kk++)
        {
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    // 选择此刀的切割位置

                    // 水平切, 遍历切的位置
                    for (int a = i + 1; a < m; a++)
                    {
                        // 上面的一块中至少要有一个苹果
                        if (apples[i][j] > apples[a][j])
                        {
                            f[kk][i][j] = (f[kk][i][j] + f[kk - 1][a][j]) % mod;
                        }
                    }
                
                    // 垂直切
                    for (int b = j + 1; b < n; b++)
                    {
                        // 左侧块中至少有一个苹果
                        if (apples[i][j] > apples[i][b])
                        {
                            f[kk][i][j] = (f[kk][i][j] + f[kk - 1][i][b]) % mod;
                        }
                    }
                }
            }
        }
        
        return f[k - 1][0][0];
    }
};

原理思路:

        apples 数组,后缀和用于记录一块披萨中的苹果数量,用一块中的左上角来代替此块含有的苹果数。

        此题的关键是,dp[ k ][ i ][ j ] 的含义代表还剩下 k 刀没切,剩下的是左上角为 i ,j 的披萨状态时的切割方案总数。这是我自己的理解,力扣上dp数组定义的含义感觉不如我这样写和解释更直观,不过原理肯定是一样的。

        知道dp数组的含义,就很好写了。

        首先计算 apples 数组,这个就不用解释了,不会的话,建议去学习一下前缀和,二维前缀和的基础算法就行,同时初始化一下dp。

        初始化dp数组:显然在还需要切0刀,剩下最后一块披萨中有苹果时,表示切好了,是一种情况,赋值为1,否则不成立赋值为0;

f[0][i][j] = apples[i][j] > 0;

        遍历顺序:一定是先遍历切割刀数,因为就比如一个形状披萨状态下,切两刀肯定需要切一刀的状态递推而来,后面根据递推式也能看出来。

        递推方程:两种切法分类讨论:

        水平切:肯定是从第一行下边开始切,总不能切空气吧,所以是 i + 1 开始遍历,然后切完后上面的那块中一定要有苹果,所以需要判断一下,切完此刀后,剩下的大块需要再切 kk - 1刀,我们就不用再去遍历了,dp数组含义就是这个,根据这个写出递推式。

                递推式:f[ kk ][ i ][ j ] = (f[ kk ][ i ][ j ] + f[ kk - 1 ][ a ][ j ]) % mod;

        垂直切:与水平切同理,直接给出递推式:

                递推式:f[ kk ][ i ][ j ] = (f[ kk ][ i ][ j ] + f[ kk - 1 ][ i ][ b ]) % mod;

       最后,返回结果,显然,在初始状态还剩切k - 1刀时是我们需要的结果状态。

       return f[ k - 1 ][ 0 ][ 0 ];

       结束。

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

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

相关文章

根据Dockerfile创建容器案例讲解

-f为dokerfile的路径&#xff0c; -t为新镜像的名称及版本。 后面这个点是寻址路径。

【第三阶段】kotlin语言的字符串遍历操作

fun main() {val str1:String"AFWSDKFJWIUHGWINUWVRV"str1.forEach(){ it->println("所有字符&#xff1a;$it")} }执行结果

移动折叠隔断设计,自由与灵感的展现

移动折叠隔断设计可以展现自由与灵感的多样性&#xff0c;以下是一些相关的设计思路&#xff1a; 多样的材质选择&#xff1a;折叠隔断可以采用各种材质&#xff0c;如玻璃、木材、金属等&#xff0c;每种材质都有独特的质感和表现力。可以根据设计需求选择合适的材质&#xff…

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时&#xff0c;为维护表的有序表&#xff0c;需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在&#xff0c;则成功返回&#xff1b; ​ 否则&#xff0…

postgresql 分类排名

postgresql 分类排名 排名窗口函数示例CUME_DIST 和 NTILE 排名窗口函数 排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括&#xff1a; • ROW_NUMBER&#xff0c;为分区中的每行数据分配一个序列号&#xff0c;序列号从 1 开始分配。 • RANK&#xff0c;计算每…

okhttp源码简单流程分析

拦截器详细解析可以看大佬简书 "https://www.jianshu.com/p/6fac73f7570f"和 “https://www.jianshu.com/p/3c740829475c” okhttp请求流程 1&#xff1a;OkHttpClient okHttpClient new OkHttpClient.Builder() 构建一个okhttpClient对象&#xff0c;传入你想传入的…

Wlan——锐捷AC冗余方案讲解(集群AC、热备AC、VAC)

目录 无线AC集群 AC集群的原理 AC集群的实现方式与配置 通过AC集群实现负载分担 AP的Failover优先级 优缺点 无线AC热备 AC热备的基本概念 AC热备工作原理 保活报文类型 热备工作模式 热备AC的配置 故障检查 优缺点 无线VAC VAC的基本概念 VSL链路和业务链路 …

软件需求-架构师之路(五)

软件需求 软件需求&#xff1a; 指用户 对系统在功能、行为、性能、设计约束等方面的期望。 分为 需求开发 和 需求管理 两大过程。 需求开发&#xff1a; 需求获取需求分析需求定义&#xff08;需求规格说明书&#xff09;需求验证&#xff1a;拉客户一起评审&#xff0c…

Vim在Mac电脑中的下载与安装方法:MacVim

本文介绍在Mac系统电脑中&#xff0c;下载、安装文本编辑器Vim软件&#xff08;MacVim软件&#xff09;的具体方法。 在Mac系统电脑中&#xff0c;原本就带有一个非图形界面的Vim&#xff1b;只要我们在终端中&#xff0c;输入如下的代码&#xff0c;就可以查看系统自带的非图形…

win10在vmware16.2.3上安装macos13.1系统

第一步、安装vmware版本信息如下 第二步、下载unlocker426放到安装文件夹 第三步、管理员身份运行unlock.exe 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS13.1并选择语言 第六步、选择磁盘工具抹掉格式化安装磁盘 第七步、格式化完成后退出磁盘工具 第八步、…

网工内推 | 外企网工,带专业培训,NP认证优先

01 广州开讯通信技术有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、负责组织制定系统集成项目的技术方案编写、标书的准备、讲解及用户答疑等工作; 2、配合客户经理完成与用户的技术交流、技术方案宣讲、系统演示等工作; 3、配…

【第三阶段】kotlin语言中的==与===比较操作

"" 内容的比较 相当于Java的equals() "" 引用的比较 1. fun main() {val str1"kotlin"val str2"kotlin"//java写法println(str1.equals(str2))//kt写法println(str1str2)//结论 str1.equals(str2)等价于str1str2 }执行结果 2. fu…

appium2 安装 和出现问题解决

1.安装环境 A macOS, Linux, or Windows operating systemNode.js version in the SemVer range ^14.17.0 || ^16.13.0 || >=18.0.0NPM version >= 8 (NPM is usually bundled with Node.js, but can be upgraded independently) 1.1只要安装nodejs最新版就好了 1.2安…

leetcode473. 火柴拼正方形(回溯算法-java)

火柴拼正方形 leetcode473 火柴拼正方形题目描述回溯算法 上期经典算法 leetcode473 火柴拼正方形 难度 - 中等 原题链接 - leetcode473 火柴拼正方形 题目描述 你将得到一个整数数组 matchsticks &#xff0c;其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

第十三章 SpringBoot项目(总)

1.创建SpringBoot项目 1.1.设置编码 1.4.导入已有的spring boot项目 2.快速搭建Restfull风格的项目 2.1.返回字符串 RestController public class IndexController {RequestMapping("/demo1")public Object demo1() {System.out.println("demo1 ran...."…

蝉联第一 | 2022中国数据泄露防护市场份额报告发布

2022年天空卫士DLP 市场份额位列中国第一 IDC 2022中国数据泄露防护市场份额报告于8月14日发布。报告主要阐述中国数据泄露防护市场的规模、厂商份额以及技术发展变化等内容。报告数据显示&#xff0c;2022年中国中国数据泄露防护&#xff08;DLP&#xff09;市场规模为1.31亿…

智慧工地云平台源码——塔机监控系统

智慧工地概念 智慧工地是一种崭新的工程全生命周期管理理念&#xff0c;是指运用信息化手段&#xff0c;通过对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟…

【Python程序设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,原创项目其他均为抄袭

基于Python Flask的全国气象数据采集及可视化系统 一、项目简介二、项目技术三、项目功能四、运行截图五、分类说明六、实现代码七、数据库结构八、源码下载地址 一、项目简介 本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据&#x…

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…