你要開發一座金礦,地質勘測學家已經探明了這座金礦中的資源分布,並用大小為 m * n 的網格 grid 進行了標註。每個單元格中的整數就表示這一單元格中的**數量;如果該單元格是空的,那麼就是 0。
為了使收益最大化,礦工需要按以下規則來開採**:
示例 1:
輸入:示例 2:grid = [[0,6,0],[5,8,7],[0,9,0]]
輸出:24
解釋:
[[0,6,0],
[5,8,7],
[0,9,0]]
一種收集最多**的路線是:
9 -> 8 -> 7。
輸入:問題分析這題上面說了一大堆,其實就是在乙個二維陣列中從任一位置開始,可以往他的上下左右4個方向走,然後返回走過的路線中值最大的,0其實就相當於障礙物,不能往位置為0的地方走,畫個簡單的圖看一下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。
我們需要遍歷每乙個位置,從任何乙個位置開始找到最大路徑,所以**大致輪廓如下
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的時候再反過來擺動。按照這種思路,寫 那麼我這樣寫是沒毛病的...