DFS+DP解情境模擬題: 走出邊界的方法數 Out of Boundary Paths_Leetcode #576

閱讀時間約 6 分鐘

題目敘述

題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數

小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種?

方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。


題目的原文敘述


測試範例

Example 1:

raw-image
Input: m = 2, n = 2, maxMove = 2, startRow = 0, startColumn = 0
Output: 6

Example 2:

raw-image
Input: m = 1, n = 3, maxMove = 3, startRow = 0, startColumn = 1
Output: 12

約束條件

Constraints:

  • 1 <= m, n <= 50

板子的高度和寬度都介於1~50之間。

  • 0 <= maxMove <= 50

最大移動步數介於0步和50步之間。

  • 0 <= startRow < m

小球的起始位置的y座標一定在界內。

  • 0 <= startColumn < n

小球的起始位置的x座標一定在界內。


演算法

這題滿直覺,可以想到就用遊戲規則和DFS深度優先搜索來進行情境模擬。

從小球指定的初始位置出發,每步可以往上、下、左、右移動一格,最多可以移動maxMove

當小球成功移動到界外時,代表找到一條走出邊界的方法數。

動態更新過程中,把每次當下的狀態(x, y, step)和紀錄到的答案儲存在DP table,避免重複計算,進而提升程式執行效率


程式碼

class Solution:
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:

# Generate N4 neighborhood vector: North, East, South, West
N4 = tuple( vector for vector in itertools.pairwise([0, 1, 0, -1, 0]) )

# DP table to keep path count of getting out of boundary
dp = {}

def move(x, y, step=0):

## Look-up DP table to avoid repeated computation
if (x, y, step) in dp:
return dp[x, y, step]

## Base case:
# out of boundary, we find one path
if x < 0 or x >= n or y < 0 or y >= m :
dp[x, y, step] = 1
return 1

## Base case:
# No available step anymore
if step == 0:
dp[x, y, step] = 0
return 0

## General cases
# Explore the map with N4 neighborhood vector
count = 0
for dx, dy in N4:
count += move(x+dx, y+dy, step-1) % (10**9+7)

dp[x, y, step] = count % (10**9+7)

return dp[x, y, step]

# ======================================================
# Start DFS visiting from starting point with given max steps
return move(x=startColumn,y=startRow, step=maxMove)


複雜度分析

h = 板子的高度

w =板子的寬度

S = 最大可移動步數


時間複雜度:

用DFS來模擬小球的移動過程,探索整張板子,並且把每個狀態(x, y, step)對應到的答案紀錄在DP table中,避免重複搜索,所需時間為O(h * w * S)

空間複雜度:

DP table 會需要儲存每一個(x, y, step)狀態所對應的答案,最大所需空間為O(h * w * S)


關鍵知識點

動態更新過程中,把每次當下的狀態(x, y, step)和紀錄到的答案儲存在DP table,避免重複計算,進而提升程式執行效率

為什麼要這個做? 因為格子點有可能會重複拜訪,假如沒有把每個狀態的答案存起來,會有冗餘的重複計算,造成run-time time-out超過平台所設定的時間限制。


Reference:

[1] Out of Boundary Paths_ Python by DFS + N4 with DP

81會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
題目敘述 題目會給我們一個輸入陣列prices分別代表不同交易日的股票價格,問我們在帶有冷卻條件的情況下,不限制交易次數,請問作多的最大獲利是多少? 冷卻條件的定義: 賣出股票的下一天,不能買入股票。 也就是說第i天賣出股票,最快要在i+2天才可以選擇買入股票。
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
這題也算是Leetcode 上經典的DP考題之一,也是很好的DP邏輯思考練習題。 題目敘述 題目會給我們一個nums陣列,分別代表每棟房屋的價值,也就是房屋內有的現金數量。 題目敘述給的情境是假想盜賊要偷東西,限制是相鄰的兩棟房屋不能一起偷,只能選擇其中一棟,否則就會觸發警報器。 請問怎麼選
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
題目敘述 題目會給我們一個輸入陣列prices分別代表不同交易日的股票價格,問我們在帶有冷卻條件的情況下,不限制交易次數,請問作多的最大獲利是多少? 冷卻條件的定義: 賣出股票的下一天,不能買入股票。 也就是說第i天賣出股票,最快要在i+2天才可以選擇買入股票。
題目敘述 題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種? 最後回傳答案之前,記得對109 + 7做除法取餘數。 詳細的題目可在這裡看到 數字鍵盤的配置如下圖 象棋的"馬"步 日字型走法 示意圖
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
書中提到的決策思考習慣,就像是現代人的獨孤九劍,要知道獨孤九劍是一門沒有「存量」的功夫,它的核心就是「無招勝有招,無極生有極」,面對複雜變化且充滿未知的複雜未來,持續進化的決策思考習慣看似沒有固定的章法跟套路,好像各領域都可以遷移應用沒有標準答案,卻是見招拆招,不斷依據新的形勢,做出新的判斷...
Thumbnail
2017年的秋天我負責公司校園招募的專案,實地的到了幾個優秀的大學做應屆畢業生的宣講跟面試。面試過程中,我們一定會問一個問題:「你這一生最大的挫折是什麼?你當時怎麼克服?」
Thumbnail
交友江湖走跳,除了靠顏值,也靠文案力。請不要小看文字的力量,在短短一張頁面的自我介紹,這一兩百字,可能就決定對方是否與你連結,或者陰陽兩隔。無論你使用哪種交友軟體,大致上不脫三個問題自我介紹:我是誰?我喜歡?我希望的約會對象?現在拿出你的筆記,記下文案三個大原則:真實、誠懇、具體。
Thumbnail
數位轉型是台灣產業轉型,由代工轉為品牌的必然環節,但企業該如何在發展的過程中做好數位轉型,跨越過困難障礙,成功升級,其中的關鍵將帶大家來解密。 Table of Content 1.數位轉型關鍵因素前言 2.數位轉型失敗核心原因 3.數位轉型問題與解決方案 4.數位轉型的正確順序 數位轉型突破產業
Thumbnail
在這個競爭激烈的大環境中,知道該如何善用自己的天賦強項是非常重要的。但是,你真的知道自己的「能力」是什麼嗎?哈利熊現在就來幫你剖析究竟該如何發掘自己的潛能!
Thumbnail
「聖人不死、大盜不止。」入圍金馬56屆最佳新導演的本片以新科技為背景,我們將跟著導演/主角一起走進被區塊鏈改變的新世界——我們該跟尋聖人還是大盜?或著,其實都不是?
Thumbnail
在股市裡常常是從不同的角度,看到截然不同的市場面貌,採取適當的觀點來解讀所面對的情境,才能得到相對合理的結果,重大財經事件當然會影響股市波動,但觀察股市適當的觀點還是得回歸基本面的變化
Thumbnail
在工作內容彼此高度相依的環境中,培養「管別人閒事」的文化是重要的解決方法之一;然而這在文化層面會成為一種挑戰:幫人與被幫的兩方,如果沒有一致的願景、以及正面善意看待,就很容易發生衝突。
Thumbnail
他說:「你不必到多舒服的地方才能創作,你也不必到多高級的地方才想得出好想法、做出好作品,你只要出席。你只要出席,你就讓場所變成你的主場了。不管上半場下半場,總之你要掌握全場,你要掌控你自己,你要真的趴下去,做。」
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
書中提到的決策思考習慣,就像是現代人的獨孤九劍,要知道獨孤九劍是一門沒有「存量」的功夫,它的核心就是「無招勝有招,無極生有極」,面對複雜變化且充滿未知的複雜未來,持續進化的決策思考習慣看似沒有固定的章法跟套路,好像各領域都可以遷移應用沒有標準答案,卻是見招拆招,不斷依據新的形勢,做出新的判斷...
Thumbnail
2017年的秋天我負責公司校園招募的專案,實地的到了幾個優秀的大學做應屆畢業生的宣講跟面試。面試過程中,我們一定會問一個問題:「你這一生最大的挫折是什麼?你當時怎麼克服?」
Thumbnail
交友江湖走跳,除了靠顏值,也靠文案力。請不要小看文字的力量,在短短一張頁面的自我介紹,這一兩百字,可能就決定對方是否與你連結,或者陰陽兩隔。無論你使用哪種交友軟體,大致上不脫三個問題自我介紹:我是誰?我喜歡?我希望的約會對象?現在拿出你的筆記,記下文案三個大原則:真實、誠懇、具體。
Thumbnail
數位轉型是台灣產業轉型,由代工轉為品牌的必然環節,但企業該如何在發展的過程中做好數位轉型,跨越過困難障礙,成功升級,其中的關鍵將帶大家來解密。 Table of Content 1.數位轉型關鍵因素前言 2.數位轉型失敗核心原因 3.數位轉型問題與解決方案 4.數位轉型的正確順序 數位轉型突破產業
Thumbnail
在這個競爭激烈的大環境中,知道該如何善用自己的天賦強項是非常重要的。但是,你真的知道自己的「能力」是什麼嗎?哈利熊現在就來幫你剖析究竟該如何發掘自己的潛能!
Thumbnail
「聖人不死、大盜不止。」入圍金馬56屆最佳新導演的本片以新科技為背景,我們將跟著導演/主角一起走進被區塊鏈改變的新世界——我們該跟尋聖人還是大盜?或著,其實都不是?
Thumbnail
在股市裡常常是從不同的角度,看到截然不同的市場面貌,採取適當的觀點來解讀所面對的情境,才能得到相對合理的結果,重大財經事件當然會影響股市波動,但觀察股市適當的觀點還是得回歸基本面的變化
Thumbnail
在工作內容彼此高度相依的環境中,培養「管別人閒事」的文化是重要的解決方法之一;然而這在文化層面會成為一種挑戰:幫人與被幫的兩方,如果沒有一致的願景、以及正面善意看待,就很容易發生衝突。
Thumbnail
他說:「你不必到多舒服的地方才能創作,你也不必到多高級的地方才想得出好想法、做出好作品,你只要出席。你只要出席,你就讓場所變成你的主場了。不管上半場下半場,總之你要掌握全場,你要掌控你自己,你要真的趴下去,做。」