《炮兵陣地》解題報告

2021-04-08 18:12:43 字數 2186 閱讀 3718

《炮兵陣地》解題報告

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 4phpp

pphh

pppp

phpp

phhp

sample output

6思路:

因為聽說是經典的狀態壓縮dp才做的,所以即使聽聞有人用搜尋過了,我還是決定試一下用dp(不過其實是十分類似與搜尋的)。

解題思路大致是這樣的,假設地圖存在map陣列中,對於map[i][j]如果是p,就可以有放兵與不放兵兩種方案,但對於在i和j位置之前的所有p的擺放方案有多種方案,我們將這兩種方案分別去嘗試與pij之前所有方案結合,則pij又會有很多種方案。

即,取status[i]= (ij位置上是p),動態方程可以表示為:

status[i] = status[i-1] ∪         x & pi 是指將pi放在x方案中,valid是檢驗方案的合法性。

valid函式可以用採用以下約束條件:

當前方案中,pi的位置上無士兵或可能被上下攻擊的可能。

當前方案中,pi的左邊2格無士兵,右邊2格也無士兵,即無左右受攻擊的可能。

光有這些是不夠的,因為無論從空間還是時間上都會超出題目要求的範圍。

為了解決空間問題,我們可以對行進行壓縮狀態,我採用類似4進製的表示方式來壓縮狀態:

encode(int solution, int length)

decode類似。

比如 phpp,對於第三個p就可以有以下幾種狀態:

3000、0030、0000、3003、0003

2000、0020、0000、2002、0002

該狀態的某個位置上有數,表示在縱向上有士兵可以攻擊,橫向的攻擊直接求左邊兩個是否為3就行了。因為dp順序是自左向右、自上向下的。所以對於每個士兵的攻擊只需考慮兩個方向而不是四個方向。

為避免浪費大量空間,根據動態方程,我們只需要保留status[i-1] 的狀態集就行了,然後更新status[i]為status[i-1],繼續求解。所以我取bitset記錄status[i]的所有狀態集(因為狀態已經可以被壓縮為乙個int值了),另外我用索引陣列的方式記錄某狀態當前的最佳值。

同樣以phpp為例:3000可以壓縮為3(反過來壓也可以,只要解壓和壓縮是對稱的就行),其solution[3] =1,0030壓縮為48,solution[48]=1,3003壓縮為195,solution[195]=2。在對以後每行的狀態集的維護中,記得保持solution[x]的最大值。

對於更新status[i]要注意,求status[i]時使用的bitset是status[i-1]的,千萬不要用正在修改的status[i]的bitset求,可以使用乙個bitset backup來輔助儲存。

通過以上處理,基本上就可以保證空間上不超時了,但是時間的問題依然存在。由於status[i]的bitset在不斷擴大,所以每個更新status[i+1]都是件越來越麻煩的事情。為了控制bitset的大小,需要像搜尋中剪支一樣,剪去一些不可能產生最優解的狀態。

我使用的剪支方案是,單行的最大擺放士兵數是(int)((m+2)/3),所以對於某一狀態來說,如果該狀態的解值+單行最大擺放士兵數《目前最優解,那麼就可以忽略該方案了。因為我們的狀態記錄的是一行的狀態情況,所以對於第i行某一狀態而言,加上下行最大的擺放士兵數都無法達到最優解的話,那麼就沒必要繼續保留該狀態到下行了,所以可以略去。

gfoj 炮兵陣地

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

poj 炮兵陣地

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

1185 炮兵陣地

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