Leetcode每日一題:1444. 切披薩的方案數(2023.8.17 C++)

目錄

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.pswp.cn/news/42913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring(三):Spring中Bean的生命周期和作用域

前言 在 Spring 中&#xff0c;那些組成應用程序的主體及由 Spring IOC 容器所管理的對象&#xff0c;被稱之為 bean。簡單地講&#xff0c;bean 就是由 IOC 容器初始化、裝配及管理的對象&#xff0c;除此之外&#xff0c;bean 就與應用程序中的其他對象沒有什么區別了。而 b…

Oracle數據庫運維大全

以下是一些常見的Oracle數據庫運維任務和對應的語句腳本示例&#xff1a; 檢查數據庫實例狀態&#xff1a; SELECT instance_name, status, startup_time FROM v$instance; 查看數據庫版本和補丁級別&#xff1a; SELECT * FROM v$version; SELECT patch_id, action, status …

LeetCode 熱題 100(四):48. 旋轉圖像、240. 搜索二維矩陣 II、234. 回文鏈表

一.48. 旋轉圖像 題目要求&#xff1a;就是一個順時針的旋轉過程。 思路&#xff1a;觀察矩陣&#xff0c;得出翻轉前第i行的第J個元素 等于 翻轉后倒數第i列的第J個元素&#xff0c;舉例說明&#xff0c;第1行第2個元素為“2”&#xff0c;翻轉后到了 倒數第1列的第2個元素…

MAC環境,在IDEA執行報錯java: -source 1.5 中不支持 diamond 運算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 運算符 (請使用 -source 7 或更高版本以啟用 diamond 運算符) 進入設置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

vue項目預覽pdf功能(解決動態文字無法顯示的問題)

最近&#xff0c;因為公司項目需要預覽pdf的功能&#xff0c;開始的時候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因為pdf變成了需要根據內容進行變化的&#xff0c;然后&#xff0c;就出現了需要動態生成的文字不顯示了。換了好多好多的插件…

Flink安裝與使用

1.安裝準備工作 下載flink Apache Flink: 下載 解壓 [dodahost166 bigdata]$ tar -zxvf flink-1.12.0-bin-scala_2.11.tgz 2.Flinnk的standalone模式安裝 2.1修改配置文件并啟動 修改&#xff0c;好像使用默認的就可以了 [dodahost166 conf]$ more flink-conf.yaml 啟動 …

【辦公自動化】使用Python批量生成PPT版榮譽證書

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

RocketMQ消費者可以手動消費但無法主動消費問題,或生成者發送超時

1.大多數是配置問題 修改rocketmq文件夾broker.conf 2.配置與集群IP或本地IPV4一樣 重啟 在RocketMQ獨享實例中支持IPv4和IPv6雙棧&#xff0c;主要是通過在網絡層面上同時支持IPv4和IPv6協議棧來實現的。RocketMQ的Broker端、Namesrv端和客戶端都需要支持IPv4和IPv6協議&…

Python土力學與基礎工程計算.PDF-螺旋板載荷試驗

python 求解代碼如下&#xff1a; 1. import numpy as np 2. 3. # 已知參數 4. p_a 100 # 標準壓力&#xff0c; kPa 5. p np.array([25, 50, 100, 200) # 荷載&#xff0c; kPa 6. s np.array([2.88, 5.28, 9.50, 15.00) / 10 # 沉降量&#xff0c; cm 7. D 10 # 螺旋板直…

C語言:選擇+編程(每日一練)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;尼科徹斯定理 示例1 題二&#xff1a;等差數列 示例2 本人實力有限可能對一些地方解釋和理解的不夠清晰&…

Redis知識(一)

目錄 Redis過期刪除和內存淘汰策略&#xff1a; 過期刪除策略&#xff1a; 內存淘汰策略&#xff08;解決內存過大問題&#xff09;&#xff1a; LRU和LFU以及他們在Redis里的實現 主從復制 哨兵模式 緩存 緩存雪崩 緩存擊穿 緩存穿透 數據庫和緩存一致性問題 Redis…

windows下redis服務啟動及.bat文件中中redis服務的啟動

windows windows下redis服務的啟動 1、不配置環境變量 找到redis服務的安裝目錄進入命令行窗口并輸入命令redis-server.exe redis.windows.conf2、配置環境變量 將redis安裝目錄配置在path環境變量中之后就可以在cmd窗口的任意位置輸入redis-server命令就可以啟動redis服務…

材料行業可以轉IC設計后端嗎?

近來有許多材料行業的小伙伴通過后臺來問我對于職業規劃的看法&#xff0c;甚至有些小伙伴直接點明了某個行業適不適合自己&#xff0c;那么我這邊僅以近年來比較熱門的數字芯片設計來展開講講&#xff0c;材料適不適合轉行做IC呢。 對于理工科的同學而言&#xff0c;選擇哪個…

Graal 編譯器

一開始,我們來講一個故事。假設有一個名為 John 的開發人員,他正在嘗試編寫一些高性能的 Java 代碼。他遇到了一些性能和速度問題,因為他的應用需要經常從大量的數據源中獲取數據,并進行計算。他嘗試了許多優化工具和技術,但是仍然無法滿足他的需求。在這個時候,他聽說了…

公告:微信小程序備案期限官方要求

備案期限要求 1、若微信小程序未上架&#xff0c;自2023年9月1日起&#xff0c;微信小程序須完成備案后才可上架&#xff0c;備案時間1-20日不等&#xff1b; 2、若微信小程序已上架&#xff0c;請于2024年3月31日前完成備案&#xff0c;逾期未完成備案&#xff0c;平臺將按照…

Android Studio實現列表展示圖片

效果&#xff1a; MainActivity 類 package com.example.tabulation;import android.content.Intent; import android.os.Bundle; import android.view.View;import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; im…

解決 Maven 創建 Spring Boot 項目時出現 “Cannot access alimaven“ 錯誤的方法

系列文章目錄 文章目錄 系列文章目錄前言一、確認 Maven 配置二、創建 Spring Boot 項目三、修改項目的 Maven 配置四、清除 Maven 本地倉庫五、重新構建項目總結前言 Maven 是 Java 項目的構建工具,而 Spring Boot 則是用于快速構建 Spring 應用程序的框架。但有時,在創建 …

Redis擴容與一致性Hash算法解析

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 資源分享 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://dr…

Java導出數據到Excel

系列文章目錄 文章目錄 系列文章目錄前言一、為什么需要導出數據到Excel?二、使用Java導出數據到Excel的步驟1.添加依賴2.編寫導出邏輯3.運行測試總結前言 當今數據處理的場景中,Excel仍然是一個不可或缺的工具,用于存儲、分析和共享數據。在Java應用程序中,有時候需要將數…

神經網絡基礎-神經網絡補充概念-04-梯度下降法

概念 梯度下降法是一種常用的優化算法&#xff0c;用于在機器學習和深度學習中更新模型參數以最小化損失函數。它通過迭代地調整參數&#xff0c;沿著損失函數的負梯度方向移動&#xff0c;從而逐步逼近損失函數的最小值。 基本思想 梯度下降法的基本思想是&#xff1a;在每…