446,回溯演算法解黃金礦工問題

2021-10-09 11:54:01 字數 1961 閱讀 7393

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m * n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的**數量;如果該單元格是空的,那麼就是 0。

為了使收益最大化,礦工需要按以下規則來開採**:

示例 1:

輸入

grid = [[0,6,0],[5,8,7],[0,9,0]]

輸出:24

解釋

[[0,6,0],

[5,8,7],

[0,9,0]]

一種收集最多**的路線是:

9 -> 8 -> 7。

示例 2:

輸入

grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]

輸出:28

解釋

[[1,0,7],

[2,0,6],

[3,4,5],

[0,3,0],

[9,0,20]]

一種收集最多**的路線是:

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7。

問題分析這題上面說了一大堆,其實就是在乙個二維陣列中從任一位置開始,可以往他的上下左右4個方向走,然後返回走過的路線中值最大的,0其實就相當於障礙物,不能往位置為0的地方走,畫個簡單的圖看一下

我們需要遍歷每乙個位置,從任何乙個位置開始找到最大路徑,所以**大致輪廓如下

public

intgetmaximumgold

(int

grid)

}//返回最大路徑值

return res;

}

**的大致輪廓寫出來了,這裡主要是dfs這個函式,他表示的是以(i,j)為座標點,沿著他的上下左右4個方向查詢最大路徑,這裡我們很容易把它想象成為一顆4叉樹,就像下面這樣

看到這個圖,很容易想到之前講的426,什麼是遞迴,通過這篇文章,讓你徹底搞懂遞迴。他會沿著每乙個分支一直走下去,直到遇到終止條件,並且把走過的位置全部置為0,表示不能再走這個位置了。終止條件是什麼呢,很明顯,i和j都不能越界,並且當前位置不能是0,也就是下面這樣

if

(i <

0|| i >= grid.length || j <

0|| j >= grid[0]

.length || grid[i]

[j]==0)

return

0;

因為使用的是遞迴,往下走的時候把當前的值給置為0了,當遞迴往回走的時候我們當前位置的值給還原,所以上面dfs的最終**如下

public

intdfs

(int

grid,

int x,

int y)

總結這題需要遍歷所有的位置,然後以他為中心點往他的上下左右4個方向查詢,最後返回找到的最大值即可。如果遍歷到某個位置的時候先要把它置為0,表示已經訪問過了,當最後訪問完之後還要把它復原。

黃金礦工 回溯演算法

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 示例 2 輸入 grid 1,0,7 2,0,6 3,4,5 0...

leetcode1219 黃金礦工(回溯)

你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的 數量 如果該單元格是空的,那麼就是 0。為了使收益最大化,礦工需要按以下規則來開採 每當礦工進入乙個單元,就會收集該單元格中的所有 礦工每次可以從當...

黃金礦工鉤子搖擺的問題

隔了幾個月,我有需求要用到四元數的地方了,當時寫萬向鎖還還愁一直找不到四元數有什麼用。偶然間寫簡單的 礦工的時候,發現了乙個問題。按理來說 那麼如果想讓鉤子來回擺動,假設先向左,那麼就應該在鉤子旋轉成 同理,當rotation 0,0,45的時候再反過來擺動。按照這種思路,寫 那麼我這樣寫是沒毛病的...