座標型動態規劃 轟炸敵人

2021-10-18 23:00:36 字數 3753 閱讀 7856

想象一下炸彈人遊戲,在你面前有乙個二維的網格來表示地圖,網格中的格仔分別被以下三種符號佔據:

『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的村莊裡,每天巡警車總是從警察...