尋寶之旅 挖掘最多金礦的走法 (DFS+最佳化)Leetcode #1219

小松鼠-avatar-img
發佈於演算法題目解析 個房間
更新於 發佈於 閱讀時間約 5 分鐘

題目敘述

題目給定一個二維的整數陣列,每個格子點裡面的數字代表金礦的多寡。

從任何一個有金礦的格子點出發,以四聯通N4的方式向探索周圍的格子點,每個格子點只能拜訪一次,不能重複拜訪

請問最多能挖到多少金礦


原本的英文題目敘述


測試範例

Example 1:

Input: grid = [[0,6,0],[5,8,7],[0,9,0]]
Output: 24
Explanation:
[[0,6,0],
[5,8,7],
[0,9,0]]
Path to get the maximum gold, 9 -> 8 -> 7.

Example 2:

Input: grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
Output: 28
Explanation:
[[1,0,7],
[2,0,6],
[3,4,5],
[0,3,0],
[9,0,20]]
Path to get the maximum gold, 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7.ㄖㄨˉ

約束條件

Constraints:

  • m == grid.length

m代表地圖的高

  • n == grid[i].length

n代表地圖的寬

  • 1 <= m, n <= 15

地圖的高m 和 地圖的寬n都介於1 ~ 15之間。

  • 0 <= grid[i][j] <= 100

每個格子點蘊藏的金礦介於0~100單位之間。

  • There are at most 25 cells containing gold.

最多有25個格子點蘊藏金礦。


演算法 DFS模擬N4走法

從題意出發,每個格子點可以向東、南、西、北四個方向探索,而且不可以重複拜訪

相當於

最多金礦挖掘數

= 當下格子點的金礦數量 +Max{ 從N4挑一條路徑,拜訪可拿到的金礦}

= 當下格子點的金礦數量 + Max{向北、向東、向西、向南探索 可拿到的金礦}


使用DFS模擬N4走法,配合最大值的選擇策略最佳化即可。


程式碼 DFS模擬N4走法

class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:

h, w = len(grid), len(grid[0])

def dfs(r,c):

## Base case
# Out-of-boundary or visited or no score
if not ( 0 <= r < h) or not ( 0 <= c < w ) or grid[r][c] <= 0:
return 0

## General cases
# Go on maximal score path in N4
cur = grid[r][c]

# mark as visited to avoid repeated traversal
grid[r][c] = - cur

# Select path with maximal score in N4
res = cur + max(dfs(r+1, c), dfs(r-1, c), dfs(r, c+1), dfs(r, c-1))

# restore origin state
grid[r][c] *= -1
return res

# ----------------------------
best = 0

# 2D board scan
for r in range(h):
for c in range(w):
if grid[r][c] > 0:
best = max(best, dfs(r,c))

return best

複雜度分析

時間複雜度: O(h*w + k*4^k)

需要一個2D掃描,掃描每個格子點恰好掃描一次。

最多有k個含有金礦的格子點,每次可探索四個相鄰的鄰居格子點,
探索路徑狀態最多為O(k*4^k)


空間複雜度: O(k)

探索深度最深為O(k),就是把可能相鄰的k個含有金礦的格子點都走過一遍。


關鍵知識點

從題意出發,每個格子點可以向東、南、西、北N4四個方向探索,
而且不可以重複拜訪

相當於

最多金礦挖掘數

= 當下格子點的金礦數量 +Max{ 從N4挑一條路徑,拜訪可拿到的金礦}

= 當下格子點的金礦數量 + Max{向北、向東、向西、向南探索 可拿到的金礦}


Reference

[1] Path with Maximum Gold - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
今天的一魚三吃系列是透過 兩點之間是否存在一條路徑的題目,來回顧以前學過的DFS、BFS和Disjoint Set,鞏固圖論演算法的知識點。 英文的題目敘述在這裡 題目敘述 給定我們已知n個節點的圖,和圖上的每一條無向邊edges。 請問給定的起點start和終點end是否存在一條路徑可
今天的官方每日一題是Island Perimeter島嶼周長,很有趣的一題。 題目非常直觀好懂。也很適合拿來作為多角度複習、回顧圖論演算法的好題目。 英文的題目敘述在這裡 題目敘述 題目會給我們一個二維陣列當作地圖,格子點為1代表陸地,格子點為0代表海洋。 要求我們以四連通N4的方式拜訪
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
題目敘述 輸入給定一個鏈結串列的head node。 要求我們進行化簡,只要某個節點的右手邊存在比較大的節點,就刪除掉。 例如 5->2->13->3 5的右手邊有13,所以5刪除掉。 2的右手邊有13,所以2刪除掉。 13的右手邊沒有更大的節點,所以13留著。 3的右手邊沒有更大
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
今天的一魚三吃系列是透過 兩點之間是否存在一條路徑的題目,來回顧以前學過的DFS、BFS和Disjoint Set,鞏固圖論演算法的知識點。 英文的題目敘述在這裡 題目敘述 給定我們已知n個節點的圖,和圖上的每一條無向邊edges。 請問給定的起點start和終點end是否存在一條路徑可
今天的官方每日一題是Island Perimeter島嶼周長,很有趣的一題。 題目非常直觀好懂。也很適合拿來作為多角度複習、回顧圖論演算法的好題目。 英文的題目敘述在這裡 題目敘述 題目會給我們一個二維陣列當作地圖,格子點為1代表陸地,格子點為0代表海洋。 要求我們以四連通N4的方式拜訪
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
主力的布局過程 往往耗費長期時間 手法又細膩且隱密 等到受不了 他就默默噴發 分點解析搭配技術型態也常能搭上主力的順風車 跟著勝利券商操作 勝率也能大大提升! 重視籌碼分析 基本面跟技術面需要去研究線圖指標或財報等財務資訊 但籌碼只要花點時間研究或許就能看出端倪
Thumbnail
本文主要介紹礦產資源的會計知識與處理,影片中輔以例題演練讓觀眾更容易理解相關概念。
Thumbnail
主力的布局過程 往往耗費長期時間 手法又細膩且隱密 等到受不了 他就默默噴發 分點解析搭配技術型態也常能搭上主力的順風車 跟著勝利券商操作 勝率也能大大提升! 重視籌碼分析 基本面跟技術面需要去研究線圖指標或財報等財務資訊 但籌碼只要花點時間研究或許就能看出端倪 改
Thumbnail
有關於「清單煉金術(Goldlist Method)」記憶法的常見問答,可以更加瞭解這個記憶方法,消除對此記憶方法的使用疑惑。
Thumbnail
有人問我,最近怎麼都沒有分享我收藏的那些礦物,是已經退坑了嗎? 實際上非但沒有退坑,還越挖越深。而且又接連又挖了好幾個坑。 現在不只有礦物了,也陸續入手了一些貝殼,琥珀,珊瑚,化石,寶石等千奇百怪的稀世珍寶。 透過這些東西,不斷的去探索在這地球的地質,生態,歷史,地理,商業
Thumbnail
三分鐘看懂挖礦是什麼!2024 年當礦工還有利潤嗎? 什麼是挖礦(Bitcoin Mining) 「挖礦」可以視為在解一個超難的數獨遊戲, 當你解出來之後獲得的獎勵就是比特幣。這個數獨遊戲足夠難讓大部分的人都要用超高級的顯卡才能解的出來,而解這些數獨遊戲的人則稱為礦工。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
主力的布局過程 往往耗費長期時間 手法又細膩且隱密 等到受不了 他就默默噴發 分點解析搭配技術型態也常能搭上主力的順風車 跟著勝利券商操作 勝率也能大大提升! 重視籌碼分析 基本面跟技術面需要去研究線圖指標或財報等財務資訊 但籌碼只要花點時間研究或許就能看出端倪
Thumbnail
本文主要介紹礦產資源的會計知識與處理,影片中輔以例題演練讓觀眾更容易理解相關概念。
Thumbnail
主力的布局過程 往往耗費長期時間 手法又細膩且隱密 等到受不了 他就默默噴發 分點解析搭配技術型態也常能搭上主力的順風車 跟著勝利券商操作 勝率也能大大提升! 重視籌碼分析 基本面跟技術面需要去研究線圖指標或財報等財務資訊 但籌碼只要花點時間研究或許就能看出端倪 改
Thumbnail
有關於「清單煉金術(Goldlist Method)」記憶法的常見問答,可以更加瞭解這個記憶方法,消除對此記憶方法的使用疑惑。
Thumbnail
有人問我,最近怎麼都沒有分享我收藏的那些礦物,是已經退坑了嗎? 實際上非但沒有退坑,還越挖越深。而且又接連又挖了好幾個坑。 現在不只有礦物了,也陸續入手了一些貝殼,琥珀,珊瑚,化石,寶石等千奇百怪的稀世珍寶。 透過這些東西,不斷的去探索在這地球的地質,生態,歷史,地理,商業
Thumbnail
三分鐘看懂挖礦是什麼!2024 年當礦工還有利潤嗎? 什麼是挖礦(Bitcoin Mining) 「挖礦」可以視為在解一個超難的數獨遊戲, 當你解出來之後獲得的獎勵就是比特幣。這個數獨遊戲足夠難讓大部分的人都要用超高級的顯卡才能解的出來,而解這些數獨遊戲的人則稱為礦工。