国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了Leetcode每日一題:1444. 切披薩的方案數(shù)(2023.8.17 C++)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1444. 切披薩的方案數(shù)

題目描述:

實(shí)現(xiàn)代碼與解析:

二維后綴和? + 動(dòng)態(tài)規(guī)劃

原理思路:


1444. 切披薩的方案數(shù)

題目描述:

????????給你一個(gè)?rows x cols?大小的矩形披薩和一個(gè)整數(shù)?k?,矩形包含兩種字符:?'A'?(表示蘋果)和?'.'?(表示空白格子)。你需要切披薩?k-1?次,得到?k?塊披薩并送給別人。

切披薩的每一刀,先要選擇是向垂直還是水平方向切,再在矩形的邊界上選一個(gè)切的位置,將披薩一分為二。如果垂直地切披薩,那么需要把左邊的部分送給一個(gè)人,如果水平地切,那么需要把上面的部分送給一個(gè)人。在切完最后一刀后,需要把剩下來的一塊送給最后一個(gè)人。

請你返回確保每一塊披薩包含?至少?一個(gè)蘋果的切披薩方案數(shù)。由于答案可能是個(gè)很大的數(shù)字,請你返回它對 10^9 + 7 取余的結(jié)果。

示例 1:

Leetcode每日一題:1444. 切披薩的方案數(shù)(2023.8.17 C++),Leetcode,leetcode,代理模式,算法

輸入:pizza = ["A..","AAA","..."], k = 3
輸出:3 
解釋:上圖展示了三種切披薩的方案。注意每一塊披薩都至少包含一個(gè)蘋果。

示例 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'?和?'.'?。

實(shí)現(xiàn)代碼與解析:

二維后綴和? + 動(dòng)態(tài)規(guī)劃

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數(shù)組
        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++)
                    {
                        // 上面的一塊中至少要有一個(gè)蘋果
                        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++)
                    {
                        // 左側(cè)塊中至少有一個(gè)蘋果
                        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 數(shù)組,后綴和用于記錄一塊披薩中的蘋果數(shù)量,用一塊中的左上角來代替此塊含有的蘋果數(shù)。

? ? ? ? 此題的關(guān)鍵是,dp[ k ][ i ][ j ] 的含義代表還剩下 k 刀沒切,剩下的是左上角為?i ,j 的披薩狀態(tài)時(shí)的切割方案總數(shù)。這是我自己的理解,力扣上dp數(shù)組定義的含義感覺不如我這樣寫和解釋更直觀,不過原理肯定是一樣的。

? ? ? ? 知道dp數(shù)組的含義,就很好寫了。

? ? ? ? 首先計(jì)算 apples 數(shù)組,這個(gè)就不用解釋了,不會(huì)的話,建議去學(xué)習(xí)一下前綴和,二維前綴和的基礎(chǔ)算法就行,同時(shí)初始化一下dp。

? ? ? ? 初始化dp數(shù)組:顯然在還需要切0刀,剩下最后一塊披薩中有蘋果時(shí),表示切好了,是一種情況,賦值為1,否則不成立賦值為0;

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

? ? ? ? 遍歷順序:一定是先遍歷切割刀數(shù),因?yàn)榫捅热缫粋€(gè)形狀披薩狀態(tài)下,切兩刀肯定需要切一刀的狀態(tài)遞推而來,后面根據(jù)遞推式也能看出來。

? ? ? ? 遞推方程:兩種切法分類討論:

? ? ? ? 水平切:肯定是從第一行下邊開始切,總不能切空氣吧,所以是 i + 1 開始遍歷,然后切完后上面的那塊中一定要有蘋果,所以需要判斷一下,切完此刀后,剩下的大塊需要再切 kk - 1刀,我們就不用再去遍歷了,dp數(shù)組含義就是這個(gè),根據(jù)這個(gè)寫出遞推式。

????????????????遞推式: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;

? ? ? ?最后,返回結(jié)果,顯然,在初始狀態(tài)還剩切k - 1刀時(shí)是我們需要的結(jié)果狀態(tài)。

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

???????結(jié)束。文章來源地址http://www.zghlxwxcb.cn/news/detail-657081.html

到了這里,關(guān)于Leetcode每日一題:1444. 切披薩的方案數(shù)(2023.8.17 C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Leetcode每日一題:18. 四數(shù)之和(2023.7.15 C++)

    目錄 18.?四數(shù)之和 題目描述: 實(shí)現(xiàn)代碼與解析: 雙指針 原理思路: ????????給你一個(gè)由? n ?個(gè)整數(shù)組成的數(shù)組? nums ?,和一個(gè)目標(biāo)值? target ?。請你找出并返回滿足下述全部條件且 不重復(fù) 的四元組? [nums[a], nums[b], nums[c], nums[d]] ?(若兩個(gè)四元組元素一一對應(yīng),則認(rèn)為

    2024年02月16日
    瀏覽(26)
  • Leetcode每日一題:15. 三數(shù)之和(2023.7.9 C++)

    目錄 15. 三數(shù)之和 題目描述: 實(shí)現(xiàn)代碼與解析: 雙指針 原理思路: ????????給你一個(gè)整數(shù)數(shù)組? nums ?,判斷是否存在三元組? [nums[i], nums[j], nums[k]] ?滿足? i != j 、 i != k ?且? j != k ?,同時(shí)還滿足? nums[i] + nums[j] + nums[k] == 0 ?。請 你返回所有和為? 0 ?且不重復(fù)的三元組

    2024年02月13日
    瀏覽(22)
  • Leetcode每日一題:2681. 英雄的力量(2023.8.1 C++)

    Leetcode每日一題:2681. 英雄的力量(2023.8.1 C++)

    目錄 2681. 英雄的力量 題目描述: 實(shí)現(xiàn)代碼與解析: 數(shù)學(xué)規(guī)律 原理思路: ????????給你一個(gè)下標(biāo)從? 0 ?開始的整數(shù)數(shù)組? nums ?,它表示英雄的能力值。如果我們選出一部分英雄,這組英雄的? 力量 ?定義為: i0 ?, i1 ?,...? ik ?表示這組英雄在數(shù)組中的下標(biāo)。那么這

    2024年02月13日
    瀏覽(17)
  • LeetCode每日一題:2594. 修車的最少時(shí)間(2023.9.7 C++)

    目錄 2594. 修車的最少時(shí)間 題目描述: 實(shí)現(xiàn)代碼與解析: 二分 原理思路: ????????給你一個(gè)整數(shù)數(shù)組? ranks ?,表示一些機(jī)械工的? 能力值 ?。 ranksi ?是第? i ?位機(jī)械工的能力值。能力值為? r ?的機(jī)械工可以在? r * n2 ?分鐘內(nèi)修好? n ?輛車。 同時(shí)給你一個(gè)整數(shù)? cars

    2024年02月09日
    瀏覽(30)
  • Leetcode每日一題:931. 下降路徑最小和(2023.7.13 C++)

    Leetcode每日一題:931. 下降路徑最小和(2023.7.13 C++)

    目錄 931.?下降路徑最小和 題目描述: 實(shí)現(xiàn)代碼與解析: 動(dòng)態(tài)規(guī)劃 原理思路: ????????給你一個(gè)? n x n ?的 ?方形? 整數(shù)數(shù)組? matrix ?,請你找出并返回通過? matrix ?的 下降路徑 ? 的 ? 最小和 ?。 下降路徑 ?可以從第一行中的任何元素開始,并從每一行中選擇一個(gè)元素

    2024年02月16日
    瀏覽(20)
  • LeetCode每日一題:1921. 消滅怪物的最大數(shù)量(2023.9.3 C++)

    目錄 1921. 消滅怪物的最大數(shù)量 題目描述: 實(shí)現(xiàn)代碼與解析: 貪心 原理思路: ????????你正在玩一款電子游戲,在游戲中你需要保護(hù)城市免受怪物侵襲。給你一個(gè)? 下標(biāo)從 0 開始 ?且長度為? n ?的整數(shù)數(shù)組? dist ?,其中? dist[i] ?是第? i ?個(gè)怪物與城市的? 初始距離 (

    2024年02月10日
    瀏覽(20)
  • Leetcode每日一題:2337. 移動(dòng)片段得到字符串(2023.8.21 C++)

    目錄 2337. 移動(dòng)片段得到字符串 題目描述: 實(shí)現(xiàn)代碼與解析: 雙指針 原理思路: ????????給你兩個(gè)字符串? start ?和? target ?,長度均為? n ?。每個(gè)字符串? 僅 ?由字符? \\\'L\\\' 、 \\\'R\\\' ?和? \\\'_\\\' ?組成,其中: 字符? \\\'L\\\' ?和? \\\'R\\\' ?表示片段,其中片段? \\\'L\\\' ?只有在其左側(cè)直接

    2024年02月11日
    瀏覽(16)
  • Leetcode每日一題:1289. 下降路徑最小和 II(2023.8.10 C++)

    Leetcode每日一題:1289. 下降路徑最小和 II(2023.8.10 C++)

    目錄 1289. 下降路徑最小和 II 題目描述: 實(shí)現(xiàn)代碼與解析: 動(dòng)態(tài)規(guī)劃 原理思路: ????????給你一個(gè)? n x n ?整數(shù)矩陣? grid ?,請你返回? 非零偏移下降路徑 ?數(shù)字和的最小值。 非零偏移下降路徑 ?定義為:從? grid ?數(shù)組中的每一行選擇一個(gè)數(shù)字,且按順序選出來的數(shù)字

    2024年02月13日
    瀏覽(21)
  • Leetcode每日一題:1782. 統(tǒng)計(jì)點(diǎn)對的數(shù)目(2023.8.24 C++)

    Leetcode每日一題:1782. 統(tǒng)計(jì)點(diǎn)對的數(shù)目(2023.8.24 C++)

    目錄 1782. 統(tǒng)計(jì)點(diǎn)對的數(shù)目 題目描述: 實(shí)現(xiàn)代碼與解析: hash + 雙指針 原理思路: ????????給你一個(gè)無向圖,無向圖由整數(shù)? n ??,表示圖中節(jié)點(diǎn)的數(shù)目,和? edges ?組成,其中? edges[i] = [ui, vi] ?表示? ui ?和? vi ?之間有一條無向邊。同時(shí)給你一個(gè)代表查詢的整數(shù)數(shù)組?

    2024年02月10日
    瀏覽(18)
  • Leetcode每日一題:1267. 統(tǒng)計(jì)參與通信的服務(wù)器(2023.8.24 C++)

    Leetcode每日一題:1267. 統(tǒng)計(jì)參與通信的服務(wù)器(2023.8.24 C++)

    目錄 1267. 統(tǒng)計(jì)參與通信的服務(wù)器 題目描述: 實(shí)現(xiàn)代碼與解析: 寫法一:兩次遍歷 + hash 原理思路: 寫法二:三次遍歷 原理思路: ????????這里有一幅服務(wù)器分布圖,服務(wù)器的位置標(biāo)識在? m * n ?的整數(shù)矩陣網(wǎng)格? grid ?中,1 表示單元格上有服務(wù)器,0 表示沒有。 如果兩

    2024年02月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包