司令部的將軍們打算在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列組成,地圖的每一格可能是山地...