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

算法練習(xí)Day30 (Leetcode/Python-動態(tài)規(guī)劃)

這篇具有很好參考價值的文章主要介紹了算法練習(xí)Day30 (Leetcode/Python-動態(tài)規(guī)劃)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

62. Unique Paths

There is a robot on an?m x n?grid. The robot is initially located at the?top-left corner?(i.e.,?grid[0][0]). The robot tries to move to the?bottom-right corner?(i.e.,?grid[m - 1][n - 1]). The robot can only move either down or right at any point in time.

Given the two integers?m?and?n, return?the number of possible unique paths that the robot can take to reach the bottom-right corner.

思路:以下分析摘自https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html#%E6%80%9D%E8%B7%AF

算法練習(xí)Day30 (Leetcode/Python-動態(tài)規(guī)劃),leetcode,動態(tài)規(guī)劃,算法

樹的深度是m+n+1,二叉樹的節(jié)點(diǎn)個數(shù)是2^(m+n+1),DFS需要遍歷整個二叉樹,算法復(fù)雜度就是O(2^(m + n - 1) - 1),這是指數(shù)級別的復(fù)雜度。

機(jī)器人從(0 , 0) 位置出發(fā),到(m - 1, n - 1)終點(diǎn)。

按照動規(guī)五部曲來分析:

1. 確定dp數(shù)組(dp table)以及下標(biāo)的含義

dp[i][j] :表示從(0 ,0)出發(fā),到(i, j) 有dp[i][j]條不同的路徑。

2. 確定遞推公式

想要求dp[i][j],只能有兩個方向來推導(dǎo)出來,即dp[i - 1][j] 和 dp[i][j - 1]。

此時在回顧一下 dp[i - 1][j] 表示啥,是從(0, 0)的位置到(i - 1, j)有幾條路徑,dp[i][j - 1]同理。

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因?yàn)閐p[i][j]只有這兩個方向過來。

3. dp數(shù)組的初始化

如何初始化呢,首先dp[i][0]一定都是1,因?yàn)閺?0, 0)的位置到(i, 0)的路徑只有一條,那么dp[0][j]也同理。

4. 確定遍歷順序

這里要看一下遞推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是從其上方和左方推導(dǎo)而來,那么從左到右一層一層遍歷就可以了。

這樣就可以保證推導(dǎo)dp[i][j]的時候,dp[i - 1][j] 和 dp[i][j - 1]一定是有數(shù)值的。

5. 舉例推導(dǎo)dp數(shù)組

數(shù)論方法:

可以看出一共m,n的話,無論怎么走,走到終點(diǎn)都需要 m + n - 2 步。

在這m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么時候向下走。

那么有幾種走法呢? 可以轉(zhuǎn)化為,給你m + n - 2個不同的數(shù),隨便取m - 1個數(shù),有幾種取法。

那么這就是一個組合問題了。

所以以下就是可走的path的個數(shù):算法練習(xí)Day30 (Leetcode/Python-動態(tài)規(guī)劃),leetcode,動態(tài)規(guī)劃,算法

遞歸法:

def Solution():
    def uniquePaths(self, m, n):
        if m == 1 or n == 1:
            return 1
        return self.uniquePaths(m - 1, n) + self.uniquePaths(m, n-1)

動態(tài)規(guī)劃法:

class Solution(object):
    def uniquePaths(self, m, n):
        dp = [[0] * n] * m
        for i in range(m):
            dp[i][0] = 1
        for j in range(n):
            dp[0][j] = 1
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[m-1][n-1]

注意!之前習(xí)慣了numpy,總是直接dp[:,0] = 1,這樣在list里是不對的。

63. Unique Paths II

如果有障礙物的話,之后的路就不通了,在設(shè)置初始狀態(tài)和更新狀態(tài)的時候都要對應(yīng)改動。

具體分析見此鏈接代碼隨想錄文章來源地址http://www.zghlxwxcb.cn/news/detail-808194.html

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if (obstacleGrid[0][0] == 1)
            return 0;
        vector<int> dp(obstacleGrid[0].size());
        for (int j = 0; j < dp.size(); ++j)
            if (obstacleGrid[0][j] == 1)
                dp[j] = 0;
            else if (j == 0)
                dp[j] = 1;
            else
                dp[j] = dp[j-1];

        for (int i = 1; i < obstacleGrid.size(); ++i)
            for (int j = 0; j < dp.size(); ++j){
                if (obstacleGrid[i][j] == 1)
                    dp[j] = 0;
                else if (j != 0)
                    dp[j] = dp[j] + dp[j-1];
            }
        return dp.back();
    }
};

到了這里,關(guān)于算法練習(xí)Day30 (Leetcode/Python-動態(tài)規(guī)劃)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 算法訓(xùn)練day41|動態(tài)規(guī)劃 part03(LeetCode343. 整數(shù)拆分、96.不同的二叉搜索樹)

    算法訓(xùn)練day41|動態(tài)規(guī)劃 part03(LeetCode343. 整數(shù)拆分、96.不同的二叉搜索樹)

    題目鏈接???? 給定一個正整數(shù) n,將其拆分為至少兩個正整數(shù)的和,并使這些整數(shù)的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2 輸出: 1 解釋: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 輸入: 10 輸出: 36 解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 說明: 你可以假設(shè) n 不小于 2 且不大于

    2024年02月10日
    瀏覽(23)
  • 算法打卡day39|動態(tài)規(guī)劃篇07| Leetcode 70. 爬樓梯(進(jìn)階版)、322. 零錢兌換、279.完全平方數(shù)

    算法打卡day39|動態(tài)規(guī)劃篇07| Leetcode 70. 爬樓梯(進(jìn)階版)、322. 零錢兌換、279.完全平方數(shù)

    Leetcode 70. 爬樓梯(進(jìn)階版) 題目: 假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。 每次你可以爬至多m (1 = m n)個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數(shù)。 輸入描述:輸入共一行,包含兩個正整數(shù),分別表示n, m 輸出描述:輸出一個整數(shù),

    2024年04月14日
    瀏覽(21)
  • LeetCode練習(xí)七:動態(tài)規(guī)劃上:線性動態(tài)規(guī)劃

    LeetCode練習(xí)七:動態(tài)規(guī)劃上:線性動態(tài)規(guī)劃

    參考《OI Wiki動態(tài)規(guī)劃》、《算法通關(guān)手冊》動態(tài)規(guī)劃篇 1.1 動態(tài)規(guī)劃簡介 ?? 動態(tài)規(guī)劃(Dynamic Programming) :簡稱 DP ,是一種通過把原問題分解為相對簡單的子問題的方式而求解復(fù)雜問題的方法。 動態(tài)規(guī)劃方法與分治算法類似,卻又不同于分治算法。 「動態(tài)規(guī)劃的核心思想

    2024年02月12日
    瀏覽(19)
  • LeetCode練習(xí)八:動態(tài)規(guī)劃下:背包問題

    LeetCode練習(xí)八:動態(tài)規(guī)劃下:背包問題

    參考: 【資料】算法通關(guān)手冊、背包九講 - 崔添翼 【文章】背包 DP - OI Wiki 【B站視頻】代碼隨想錄詳解0-1背包 ?? 背包問題 :背包問題是線性 DP 問題中一類經(jīng)典而又特殊的模型。背包問題可以描述為:給定一組物品,每種物品都有自己的重量、價格以及數(shù)量。再給定一個

    2024年01月16日
    瀏覽(20)
  • LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    參考前文 參考文章: LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費(fèi)爬樓梯) LeetCode鏈接:https://leetcode.cn/problems/unique-paths/description/ 動態(tài)規(guī)劃 : 創(chuàng)建m×n的數(shù)組, 對應(yīng)這個地圖, 數(shù)組 val 表示 有幾種方法可以走到這一格 最開始, 第一行和第一列v

    2024年02月09日
    瀏覽(48)
  • 算法練習(xí) Day38 | LeetCode509,70,746

    先導(dǎo)知識: 1、動態(tài)規(guī)劃常見題型 動態(tài)規(guī)劃基礎(chǔ)問題 背包問題 打家劫舍 股票問題 子序列問題 2、動態(tài)規(guī)劃五部曲 (1)確定dp數(shù)組的定義及下標(biāo)的含義 (2)確定遞推公式 (3)dp數(shù)組如何初始化 (4)遍歷順序 (5)打印dp數(shù)組 LeetCode509:509. 斐波那契數(shù) 題目描述: 斐波那契

    2024年02月21日
    瀏覽(13)
  • LeetCode算法題解(動態(tài)規(guī)劃)|LeetCode343. 整數(shù)拆分、LeetCode96. 不同的二叉搜索樹

    LeetCode算法題解(動態(tài)規(guī)劃)|LeetCode343. 整數(shù)拆分、LeetCode96. 不同的二叉搜索樹

    題目鏈接:343. 整數(shù)拆分 題目描述: 給定一個正整數(shù)? n ?,將其拆分為? k ?個? 正整數(shù) ?的和(? k = 2 ?),并使這些整數(shù)的乘積最大化。 返回? 你可以獲得的最大乘積 ?。 示例 1: 示例?2: 提示: 2 = n = 58 算法分析: 定義dp數(shù)組及下標(biāo)含義: dp[i]表述正整數(shù)i拆分成k個正整數(shù)

    2024年02月04日
    瀏覽(25)
  • 【算法】動態(tài)規(guī)劃 ⑦ ( LeetCode 55. 跳躍游戲 | 算法分析 | 代碼示例 )

    LeetCode 55. 跳躍游戲 : https://leetcode.cn/problems/jump-game/ 給定一個 非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的 第一個下標(biāo) 0 位置 。 數(shù)組中的每個元素 代表你在該位置可以 跳躍的最大長度。 判斷你 是否能夠到達(dá)最后一個下標(biāo)。 給定一個一維數(shù)組 , 數(shù)組元素不能有負(fù)數(shù) , 如 : {2, 2,

    2024年02月10日
    瀏覽(26)
  • LeetCode算法題解(動態(tài)規(guī)劃)|LeetCoed62. 不同路徑、LeetCode63. 不同路徑 II

    LeetCode算法題解(動態(tài)規(guī)劃)|LeetCoed62. 不同路徑、LeetCode63. 不同路徑 II

    題目鏈接:62. 不同路徑 題目描述: 一個機(jī)器人位于一個? m x n ? 網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為 “Start” )。 機(jī)器人每次只能向下或者向右移動一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。 問總共有多少條不同的路徑? 示例 1: 示例 2:

    2024年02月05日
    瀏覽(33)
  • 【算法|動態(tài)規(guī)劃No.6】leetcode63. 不同路徑Ⅱ

    【算法|動態(tài)規(guī)劃No.6】leetcode63. 不同路徑Ⅱ

    個人主頁:平行線也會相交 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學(xué)習(xí)過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進(jìn)步。

    2024年02月16日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包