【題目】
一個(gè)機(jī)器人位于一個(gè) m x n
網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為 “Start” )。
機(jī)器人每次只能向下或者向右移動(dòng)一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。
問總共有多少條不同的路徑?
示例 1:
輸入: m = 3, n = 7
輸出: 28
示例 2:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達(dá)右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
輸入: m = 7, n = 3
輸出: 28
示例 4:
輸入: m = 3, n = 3
輸出: 6
提示:
1 <= m, n <= 100
- 題目數(shù)據(jù)保證答案小于等于
2 * 10^9
【題目解析】
解題方法
采用動(dòng)態(tài)規(guī)劃的思路,定義dp[i][j]
為到達(dá)(i, j)位置的不同路徑的總數(shù),那么可以得出狀態(tài)轉(zhuǎn)移方程為:dp[i][j] = dp[i-1][j] + dp[i][j-1]
,即到達(dá)某個(gè)格子的路徑數(shù)等于它上方格子的路徑數(shù)加上它左方格子的路徑數(shù)。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 初始化一個(gè)m*n的二維數(shù)組,所有值為1。第一行和第一列的路徑數(shù)為1,因?yàn)樗鼈冎荒芤恢蓖禄蛲摇? dp = [[1]*n for _ in range(m)]
# 從(1, 1)開始遍歷,因?yàn)?0, 0)為起始點(diǎn),已經(jīng)初始化。
for i in range(1, m):
for j in range(1, n):
# 狀態(tài)轉(zhuǎn)移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
# 當(dāng)前點(diǎn)的路徑數(shù) = 從上方來的路徑數(shù) + 從左方來的路徑數(shù)
dp[i][j] = dp[i-1][j] + dp[i][j-1]
# 返回右下角點(diǎn)的路徑數(shù)
return dp[-1][-1]
執(zhí)行效率
【總結(jié)】
適用問題類型
動(dòng)態(tài)規(guī)劃算法適用于多種類型的問題,尤其是那些可以被分解為重疊子問題的計(jì)數(shù)問題、最值問題、最優(yōu)解問題等。"不同路徑"問題是一個(gè)經(jīng)典的計(jì)數(shù)問題,要求計(jì)算從網(wǎng)格的左上角到右下角的所有可能路徑數(shù)量。
解決算法:動(dòng)態(tài)規(guī)劃
算法特點(diǎn):動(dòng)態(tài)規(guī)劃算法的核心特點(diǎn)在于解決了重疊子問題,通過構(gòu)建DP表(通常是一維或二維數(shù)組)來保存子問題的解,避免了重復(fù)計(jì)算。同時(shí),DP算法能夠提供一種系統(tǒng)的求解框架,明確地定義狀態(tài)、狀態(tài)轉(zhuǎn)移方程以及初始狀態(tài)和邊界條件。
-
時(shí)間復(fù)雜度與空間復(fù)雜度:
- 時(shí)間復(fù)雜度為
O(m*n)
,其中m和n分別代表網(wǎng)格的行數(shù)和列數(shù)。這是因?yàn)樾枰闅v整個(gè)網(wǎng)格一次,對(duì)每個(gè)格子計(jì)算到達(dá)它的路徑數(shù)量。 - 空間復(fù)雜度為
O(m*n)
,主要空間開銷來源于DP表的大小。在一些特殊情況下,通過狀態(tài)壓縮技巧可以將空間復(fù)雜度優(yōu)化到O(n)
或O(m)
。
- 時(shí)間復(fù)雜度為
實(shí)踐意義
動(dòng)態(tài)規(guī)劃算法在實(shí)踐中有著廣泛的應(yīng)用,能夠有效解決包括但不限于路徑計(jì)數(shù)、字符串處理、背包問題等多種類型的問題。掌握動(dòng)態(tài)規(guī)劃不僅能夠幫助我們解決特定的算法題目,更能夠在面對(duì)實(shí)際編程和軟件開發(fā)中的復(fù)雜問題時(shí),提供一種高效且系統(tǒng)的解決方案。學(xué)習(xí)和應(yīng)用動(dòng)態(tài)規(guī)劃,對(duì)于提升個(gè)人的問題解決能力和編程能力都有顯著的幫助。
綜上所述,動(dòng)態(tài)規(guī)劃作為一種強(qiáng)大的算法設(shè)計(jì)方法論,對(duì)于解決"不同路徑"這類問題具有明顯的優(yōu)勢,它通過優(yōu)化計(jì)算過程、減少不必要的計(jì)算,不僅提高了算法的執(zhí)行效率,還增強(qiáng)了算法對(duì)于復(fù)雜問題的處理能力。