POJ 1185 炮兵陣地 狀壓dp

2021-09-25 07:35:20 字數 2426 閱讀 2490

司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地(用"h" 表示),也可能是平原(用"p"表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。

現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

第一行包含兩個由空格分割開的正整數,分別表示n和m;

接下來的n行,每一行含有連續的m個字元(『p』或者』h』),中間沒有空格。按順序表示地圖中每一行的資料。n <= 100;m <= 10。

僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。

5 4

phpp

pphh

pppp

phpp

phhp

6
做這題之前建議先去看一下poj-3245 corn fields,那題思路和這題是一樣的,但是那道簡單得多,先做完那道做這道會感覺容易一些,附上那道的部落格:poj-3245 corn fields 狀壓dp。

算是高階的狀壓dp吧,這裡的思路其實不難想,關鍵是怎麼樣不tle或mle。這裡的思路其實算是狀壓dp乙個比較常用的優化:篩選可行狀態,什麼意思呢?我們在這個具體例子裡看。

題意很簡單,乙個網格圖,有些地方可以放兵,有些地方不可以,每個兵的上下左右兩格不能有其他兵。問最多可以放多少個兵。

看到m ≤10

m \leq 10

m≤10

的時候基本上腦子裡應該有狀壓dp的概念了,問題在於,這題自上而下更新的時候,上面兩行都需要考慮,也就是說需要乙個三維的dpdp

dp陣列,而且總時間複雜度為n∗(

2m)3

n*(2^)^

n∗(2m)

3,妥妥的tle。那麼怎麼辦呢?仔細思考一下,由於左右也是有限制的,那麼我們狀壓後的1024種狀態裡,有很多是不符合要求的,比如5

(101),

12(

1100

)5(101),12(1100)

5(101)

,12(

1100

),而實際可行的狀態只有不到60種。可不可以把這些根本沒用的狀態全部去掉,這樣時間和空間不就省下來了嗎?

確實如此,我們預處理乙個陣列,把所有可行的狀態存進去,這樣,我們每次只需要遍歷這幾個狀態就完事了,時間和空間全都省出來了。

順便一提,注意n=1

n=1n=

1的情況,因為這題的動態規劃部分其實是從i=3

i = 3

i=3開始的,那麼n

nn為1其實是需要特殊處理的。

上**:

#include

#include

#include

using

namespace std;

int dp[

105][70

][70]

;int g[

105][12

];int tablet[70]

[2];

char c;

int dex =0;

bool

judge

(int s,

int i)

bool

able

(int i,

int s)

void

init()

c++;}

}if(!flag)

continue

;else tablet[

++dex][0

]= s, tablet[dex][1

]= c;}}

intmain()

}for

(int s =

0; s <= dex; s++)if

(able(1

, tablet[s][0

])) dp[1]

[s][0]

= tablet[s][1

],res =

max(res, dp[1]

[s][0]

);if(n ==1)

for(

int s =

0; s <= dex; s++)}

}if(n ==2)

for(

int i =

3; i <= n; i++)}

}}printf

("%d\n"

, res)

;}

POJ1185(炮兵陣地) 狀壓DP

每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...

POJ1185 炮兵陣地 狀壓dp

司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...

POJ 1185 炮兵陣地 狀壓DP

炮兵陣地 time limit 2000ms memory limit 65536k total submissions 25954 accepted 10004 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...