poj1185 炮兵陣地 狀態壓縮 DP

2021-06-22 23:52:12 字數 1701 閱讀 3024

炮兵陣地

time limit:2000ms

memory limit:65536k

total submissions:18629

accepted:7179

description

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

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

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

input

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

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

output

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

sample input

5 4

phpp

pphh

pppp

phpp

phhp

sample output

6
題解:

這個題跟上次那個奶牛題類似。不過這次炮台的攻擊範圍+1,擴充套件到上面兩行。所以需要用3維dp求解。

dp[i][j][k]的意思是第i行狀態為第k個時上一行狀態為第j個是炮台最大數量。我們先把每一行的狀態用sta狀態存放。相鄰兩格不能有炮台。然後將第i個狀態有多少個炮台用num陣列存起來。然後在將每行有障礙的狀態用cas存起來。初始化dp[1][1][i]的炮台數量,然後列舉接下來2-n行,滿足各種條件:此行狀態不能與障礙、上一行狀態、上兩行狀態矛盾,然後計算最大值即可。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll __int64

#define max(a,b) a>b?a:b

int dp[110][100][100];

int sta[1100];

int cas[1100];

int pd(int x)

int js1(int x)

return ans;

}int num[1100];

int main()

{ int n,m,i,j,k,l;

scanf("%d%d",&n,&m);

int t=0;

for (i=0;i<1<

poj1185 炮兵陣地(狀態壓縮)

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

poj 1185炮兵陣地(狀態壓縮)

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

POJ1185 炮兵陣地 狀態壓縮DP

感覺和3254很像,不過這次的間隔變成兩格,當前行的狀態與上兩行的狀態有關。狀態轉移方程 dp k q i max dp k q i dp q j i num k num k 表示狀態k的炮兵數量 dp k q i 表示當前第i行為狀態k上一行的狀態為q的炮兵數量總數。炮兵陣地 time limit...