想象一下炸彈人遊戲,在你面前有乙個二維的網格來表示地圖,網格中的格仔分別被以下三種符號佔據:
『w』 表示一堵牆
『e』 表示乙個敵人
『0』(數字 0)表示乙個空位
請你計算乙個炸彈最多能炸多少敵人。(最值型別)
由於炸彈的威力不足以穿透牆體,炸彈只能炸到同一行和同一列沒被牆體擋住的敵人。
注意:你只能把炸彈放在乙個空的格仔裡
示例:
輸入: [["0","e","0","0"],["e","0","w","e"],["0","e","0","0"]]
輸出: 3
解釋: 對於如下網格
0 e 0 0
e 0 w e
0 e 0 0
假如在位置 (1,1) 放置炸彈的話,可以炸到 3 個敵人
這個題目複雜的地方在於,這個炸彈的可以往四個方向傳播,並且傳播路徑上可能會遇到牆阻礙。所以這裡我們需要拆解一下問題。其實我們只需要計算乙個方向上面,然後剩下的幾個方向也是類似的,所以我們只在乙個方向上進行分析。後面的分析我們選擇向上的方向。
這裡的最後一步我的理解就是炸彈的最終位置放在什麼地方。
假設在(i,j)格放乙個炸彈,它向上炸死的敵人數分為三種情況:
可以發現當我們需要求(i,j)的時候,需要知道(i-1,j)的情況,這滿足子問題要求。
假設up[i][j]表示(i,j)格放乙個炸彈向上能炸死的敵人數
邊界情況:注意保證下標要保證大於0小於行列數
按照行,逐行計算。
時間複雜度:o(mn);空間複雜度:o(mn)
上面只解釋了向上傳播的情況。其他方向的實現類似。
#主要收穫就是從四個方向分析的動態規劃,申請了四個陣列去考慮
class
solution
:def
maxkilledenemies
(self, grid)
:"""
:type grid: list[list[str]]
:rtype: int
"""iflen
(grid)==0
orlen
(grid[0]
)==0:
return
0 up =[[
0]*len
(grid[0]
)for i in
range
(len
(grid))]
down =[[
0]*len
(grid[0]
)for i in
range
(len
(grid))]
right =[[
0]*len
(grid[0]
)for i in
range
(len
(grid))]
left =[[
0]*len
(grid[0]
)for i in
range
(len
(grid))]
for i in
range
(len
(grid)):
for j in
range
(len
(grid[0]
)):if i>0:
if grid[i]
[j]==
'e':
up[i]
[j]=up[i-1]
[j]+
1if grid[i]
[j]==
'0':
up[i]
[j]=up[i-1]
[j]elif grid[i]
[j]==
'e'and i==0:
up[i]
[j]=
1for i in
range
(len
(grid)-1
,-1,
-1):
for j in
range
(len
(grid[0]
)):if i<
len(grid)-1
:if grid[i]
[j]==
'e':
down[i]
[j]=down[i+1]
[j]+
1if grid[i]
[j]==
'0':
down[i]
[j]=down[i+1]
[j]elif grid[i]
[j]==
'e'and i==
len(grid)-1
: down[i]
[j]=
1for j in
range
(len
(grid[0]
)):for i in
range
(len
(grid)):
if j>0:
if grid[i]
[j]==
'e':
left[i]
[j]=left[i]
[j-1]+
1if grid[i]
[j]==
'0':
left[i]
[j]=left[i]
[j-1
]elif grid[i]
[j]==
'e'and j==0:
left[i]
[j]=
1for j in
range
(len
(grid[0]
)-1,
-1,-
1):for i in
range
(len
(grid)):
if j<
len(grid[0]
)-1:
if grid[i]
[j]==
'e':
right[i]
[j]=right[i]
[j+1]+
1if grid[i]
[j]==
'0':
right[i]
[j]=right[i]
[j+1
]elif grid[i]
[j]==
'e'and j==
len(grid[0]
)-1:
right[i]
[j]=
1 max1=
0for i in
range
(len
(grid)):
for j in
range
(len
(grid[0]
)):if grid[i]
[j]==
'0':
max1=
max(max1,up[i]
[j]+down[i]
[j]+right[i]
[j]+left[i]
[j])
return max1
座標型動態規劃 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?示例 1 輸入 m 3,n 2 輸出 3 解釋 從左上角開始,總共有 3 條路徑可以到達右下角。1....
區間型動態規劃
給定乙個序列 字串,進行一些操作 最後一步將序列 字串去頭 去尾 剩下的會是乙個區間 i,j 狀態自然定義為f i j 表示面對子串行 i j 時的最優性質 667.最長的回文序列 中文english 給一字串 s,找出在 s 中的最長回文子串行的長度.你可以假設 s 的最大長度為 1000.exa...
樹型動態規劃 巡邏
問題描述 在乙個地區中有 n個村莊,編號為1,2,n。有n 1條道路連線著這些村 莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其 他任乙個村莊。每條道路的長度均為 1個單位。為保證該地區的安全,巡警車每天要到所有的道路上巡邏。警察局設在編號 為1的村莊裡,每天巡警車總是從警察...