NYOJ 81 炮兵陣地(狀壓DP)

2021-07-14 05:59:01 字數 1127 閱讀 2271

時間限制:

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 表示 在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 如果在地圖中的灰色所標識的平原上...