時間限制:
2000 ms | 記憶體限制:
65535 kb
難度:6 描述
司令部的將軍們打算在n*m的網格地圖上部署他們的炮兵部隊。乙個n*m的地圖由n行m列組成,地圖的每一格可能是山地(用"h" 表示),也可能是平原(用"p"表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:
如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。
現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
輸入第一行輸出資料測試組數x(0
輸出每組測試資料輸出僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。
樣例輸入
1樣例輸出5 4phpp
pphh
pppp
phpp
phhp
6看題解寫的第一髮狀壓dp,不難理解
**中有注釋
#include#include#includeusing namespace std;
int ac[77]; /*在沒有山地的情況下每一行的所有合法狀態*/
int sum[77]; /*對應合法狀態的炮兵總數*/
int hop[105]; /*每一行山地平原的分布狀態,例如00101表示pphph*/
int dp[105][77][77]; /*dp[f][i][j]表示在f行狀態為j,在f-1行狀態為i的炮兵數量最大值*/
char map[105][12];
int main(void)
} k = ans = 0;
for(i=0;i
炮兵陣地(狀壓dp)
傳送門 poj 1185 司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域...
DP 狀壓 DP 炮兵陣地
狀態壓縮動態規劃和狀態機動態規劃 未更新 大體上來說都是通過另類的方式來儲存動態規劃中的狀態。狀壓dp其實可以分為 棋盤式 和 集合類 這篇是 棋盤式 或者叫 基於聯通性 的狀壓dp的一道經典例題 炮兵陣地的部落格。炮兵陣地這道非常經典的狀態壓縮dp題目是值得學習的,可以從中學習到 棋盤式 狀壓dp...
狀壓DP之炮兵陣地
原題來自 noi 2001 司令部的將軍們打算在 n m 的網格地圖上部署他們的炮兵部隊。乙個 n m 的地圖由 n 行 m 列組成,地圖的每一格可能是山地 用 h表示 也可能是平原 用 p 表示 在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 如果在地圖中的灰色所標識的平原上...