【力扣每日一题】2023.8.17 切披萨的方案数

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个二维数组来表示一个披萨,其中‘A’表示披萨上的苹果。

让我们切k-1刀,把披萨切成 k 份,只能横切或是竖切,最终 k 块披萨都需要拥有有苹果。

问我们一共有几种切披萨的方案。

我的第一反应就是递归去尝试,不过题目有说答案可能会很大,要取余1000000007,那么递归肯定是会超时的,所以我们应该使用动态规划。

因为每次切完披萨,送出去的不是左半边就是上半边,也就是说,披萨的右下角是会一直留下的。因此突破口应该在披萨的右下角,也就是矩阵的右下角。

题目要求每块披萨都需要有至少一个苹果,那么我们就应该要单独去统计一下苹果的分布情况,因为披萨的右下角是会一直留下来的,因此我们可以用一个二维矩阵来存放苹果的分布情况,这个矩阵坐标为 [ i , j ] 的元素就是披萨中 [ i , j ] 位置的右下角中拥有的苹果数。

那么我们初始化这个苹果分布情况数组的时候就应该从右下角开始统计,也就是利用前缀和去统计,递推公式如下,可以参考动图。

apple[i][j] += apple[i+1][j] + apple[i][j+1] - apple[i+1][j+1];

那么统计完了苹果的分布情况有什么用呢,因为要求每次切的披萨都要有苹果,那么我们可以用

apple[i][j1] - apple[i][j2]

知道如果竖切的话,从 j1 到 j2 有没有苹果。用

apple[i1][j] - apple[i2][j]

知道如果横切的话,从 i1 到 i2 有没有苹果。

解决完苹果的问题之后,我们就需要解决切披萨的方案数这个问题了。

由于固定是要切k-1刀,并且本身存放披萨就需要二维数组,因此我们的dp数组就是需要三维。

首先我们先定义dp数组的含义,dp[ i , j  , k ]的含义是披萨仅剩从坐标 i , j 开始的右下角部分,并且可以切k刀的方案数。

由于我们可以横切也可以竖切,所以递推公式有两种:

//横切
dp[i1][j][z] += dp[i2][j][z-1]
//竖切
dp[i][j1][z] += dp[i][j2][z-1]

也就是如果是横切的话,我在 i1,j 的位置可以切 z 刀的方案数就等于原本就可以切 z 刀的方案数再加上我一刀切在 i2 ,j 位置上,然后加上 i2,j 这个位置可以切 z - 1 刀的方案数。竖切也是同理。

并且我们刚刚说过了,披萨的右下角是保持不变的,所以我们应该从披萨的右下角开始递推,而刀数是从1开始的,所以刀数从小到大遍历。

最终填完dp数组之后,根据dp数组的含义,我们返回dp[ 0 , 0  , k-1 ] ,意思就是在披萨[ 0 , 0 ]的位置,我们可以切k-1刀的数目,也就是题目要我们返回的答案。

初始化的话我们依次对披萨的每个位置进行判断,如果对应的位置的右下角有苹果的话,那么一刀不切也是可以算一种方案的,也就是

dp[i][j][0] = 1

 最后要注意的就是由于答案会很大,因此每次递推我们都最结果进去取余处理。

代码:

class Solution {
public:int ways(vector<string>& pizza, int k) {int m = pizza.size(),n = pizza[0].size();vector<vector<int>>apple(m,vector<int>(n,0));   // i,j表示坐标为i,j的右下方的苹果数量for (int i = m-1; i >= 0; --i){for (int j = n-1; j >= 0; --j){if (pizza[i][j] == 'A') apple[i][j]=1;if (i == m-1 && j == n-1) continue; //防止越界提前退出.else if (j == n-1) apple[i][j] += apple[i+1][j];    //防止y轴越界else if (i == m-1) apple[i][j] += apple[i][j+1];    //防止x轴越界// 需要加上两部分并且删除重复计算的部分else apple[i][j] += apple[i+1][j] + apple[i][j+1] - apple[i+1][j+1];}}//dp[i,j,k]的含义是披萨仅剩从坐标i,j开始的右下角部分,并且可以切k刀的方案数vector<vector<vector<int>>>dp(m,vector<vector<int>>(n,vector<int>(k,0)));for (int i = m-1; i >= 0; --i){for (int j = n-1; j >= 0; --j){ if (apple[i][j] > 0) dp[i][j][0] = 1;   //有苹果的话不切也是一种办法for (int z = 1; z < k; ++z){for (int y = i+1; y <= m-1; ++y){   //横切   if (apple[i][j] - apple[y][j] > 0) {    //切出去上面的披萨的至少有一个苹果dp[i][j][z] = (dp[i][j][z] + dp[y][j][z-1])%1000000007;}}                    for (int x = j+1; x <= n-1; ++x){   //竖切if (apple[i][j] - apple[i][x] > 0){     //切出去左边的披萨至少有一个苹果dp[i][j][z] = (dp[i][j][z] + dp[i][x][z-1])%1000000007;}}}}}return dp[0][0][k-1] % 1000000007;}
};

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

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

相关文章

Risk Probability

风险概率计算 sum p1 * v1 p2 * v2 p3 * v3 ... pn * vn

【使用Hilbert变换在噪声信号中进行自动活动检测】基于Hilbert变换和平滑技术进行自动信号分割和活动检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

小程序swiper一个轮播显示一个半内容且实现无缝滚动

效果图&#xff1a; wxml&#xff08;无缝滚动&#xff1a;circular"true"&#xff09;&#xff1a; <!--components/tool_version/tool_version.wxml--> <view class"tool-version"><swiper class"tool-version-swiper" circul…

亚信科技AntDB数据库连年入选《中国DBMS市场指南》代表厂商

近日&#xff0c;全球权威ICT研究与顾问咨询公司Gartner发布了2023年《Market Guide for DBMS, China》&#xff08;即“中国DBMS市场指南”&#xff09;&#xff0c;该指南从市场份额、技术创新、研发投入等维度对DBMS供应商进行了调研。亚信科技是领先的数智化全栈能力提供商…

一篇文章教你使用Docker本地化部署Chatgpt(非api,速度非常快!!!)及裸连GPT的方式(告别镜像GPT)

本地搭建ChatGPT&#xff08;非api调用&#xff09; 第一种方法&#xff1a;使用Docker本地化部署第一步&#xff0c;下载安装Docker登录GPT 第二种方法&#xff1a;不部署项目&#xff0c;直接连接 第一种方法&#xff1a;使用Docker本地化部署 这种方法的好处就是没有登录限…

NVIDIA Jetson 项目:机器人足球比赛

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 事实上&#xff0c;整个比赛都致力于这个想法。RoboCup小型联盟&#xff08;SSL&#xff09;视觉停电技术挑战赛鼓励团队“探索本地传感和处理&#xff0c;而不是非车载计算机和全球摄像机感知环境的…

广告牌安全传感器,实时监测事故隐患尽在掌握

在现代城市中&#xff0c;广告牌作为商业宣传的重要媒介&#xff0c;已然成为城市中一道独特的风景线。然而&#xff0c;随着城市迅速发展&#xff0c;广告牌的安全问题也引起了大众关注。广告招牌一般悬挂于建筑物高处&#xff0c;量大面大。由于设计、材料、施工方法的缺陷&a…

windows ipv4 多ip地址设置,默认网关跃点和自动跃点是什么意思?(跃点数)

文章目录 Windows中的IPv4多IP地址设置以及默认网关跃点和自动跃点的含义引言IPv4和IPv6&#xff1a;简介多IP地址设置&#xff1a;Windows环境中的实现默认网关跃点&#xff1a;概念和作用自动跃点&#xff1a;何时使用&#xff1f;关于“跃点数”如何确定应该设置多少跃点数&…

深入源码分析kubernetes informer机制(三)Resync

[阅读指南] 这是该系列第三篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 为什么需要resyncresync做了什么 为什么需要resync 如果看过上一篇&#xff0c;大概能了解&#xff0c;client数据主要通…

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…

springboot里 运用 easyexcel 导出

引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…