description觀察題目,我們可以發現,對於第i行,第j列的位置p[i][j],它是否有炮兵取決於此地地形,p[i-1][j],p[i-2][j],p[i][j-1],p[i][j-2] 這四個地點是否有炮兵。同時,它會對 p[i][j+1],p[i][j+2],p[i+1][j],p[i+2][j] 造成影響。司令部的將軍們打算在n×m的網格地圖上部署他們的炮兵部隊。
乙個n×m的地圖由n行m列組成,地圖的每一格可能是山地(用」h」表示),也可能是平原(用」p」表示),如下圖。
在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊)。
一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:
如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
輸入輸出格式
輸入格式:
第一行包含兩個由空格分割開的正整數,分別表示n和m;
接下來的n行,每一行含有連續的m個字元(』p』或者』h』),中間沒有空格。按順序表示地圖中每一行的資料。n≤100,m≤10。
輸出格式:
僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。
但是,我們卻很難得到乙個準確的狀態轉移方程,因為,我們如果使用f[i][j]記錄第i行,第j列的地點有乙個炮兵,而在此之前的所有炮兵的和最大為多少,我們需要從f[i-1][m]轉移過來,但是,我們並不能確定f[i-1][m] 中,是否含有乙個炮兵在p[i-1][j],因此,我們需要使用狀態壓縮的方式,將每行m個位置的狀態壓縮到乙個數字中,這樣,我們就可以一行一行的狀態轉移,每次轉移只需要判斷該行的所有炮兵是否在對應的列上,上一行,以及上一行的上一行是否有同樣對應的列的炮兵,就可以判斷是否可以轉移了。
那麼,我們該怎麼樣狀態壓縮呢?
首先,我們可以把存在炮兵看作是1,不存在炮兵看作是0,那麼,每一行的狀態我們可以看作是連起來的二進位制串,由於m≤10,2^10=1024,所以,我們完全可以建出這個大小的陣列然後進行轉移。
所以,我們可以建出陣列 f[i][j],儲存第i行處於第j個狀態的情況下,所能得到的最大值。
但是,我們會發現,轉移狀態的過程中,我們需要保證狀態j與(i-1)的狀態、(i-2)的狀態均不重合,所以,我們可以將兩行的不同狀態組合看作乙個狀態。
這樣,我們就需要使用f[i][j][k]來儲存第i行處於狀態j,並且i-1行處於狀態k時,前i行的最多炮兵。
那麼,我們此時得到第i行的轉移方程為
f[i][j][k]=max(f[i][j][k],f[i-1][k][p]+sum[j]) (1≤i≤n,j,k,p 狀態每一列都沒有兩個及以上的炮兵 )
當然,如果企圖使用 f[i][j]來記錄當前第i行,狀態為j時,前i行的最大炮兵數量,則會出現一些無法解決的問題。
因為如果這樣做,則需要保證 (j,k,p 狀態每一列都沒有兩個及以上的炮兵),而此時轉移過程中,使用f[i][j]=f[i-2][p]+sum[j]+sum[k],而我們無法保證f[i-2][p]中的i-3行與我們得到的i-1行k狀態是否存在衝突,如果要保證它不衝突,則要繼續遞迴下去,所以這種方法並不可行。
所以,我們採取這種兩行狀態作為乙個狀態來轉移的方式,就可以很快得到答案了。
**如下:
#include
using
namespace
std;
int n,m,tot,ans;
int x[101];
int f[101][61][61];
int v[1025],num[1025];
int main()
for (int i=0;i<1
}for (int j=1;j<=tot;j++)
if (!(v[j]&x[1]))
f[1][j][1]=num[j];
for (int j=1;j<=tot;j++)
if (!(v[j]&x[2]))
for (int k=1;k<=tot;k++)
if ((!(v[j]&v[k]))&&(!(v[k]&x[1])))
f[2][j][k]=f[1][k][1]+num[j];
for (int i=3;i<=n;i++)
for (int j=1;j<=tot;j++)
if (!(v[j]&x[i]))
}printf("%d",ans);
return
0;}
狀態壓縮動態規劃 炮兵陣地
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊,乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表 示 也可能是平原 用 p 表示 例如以下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不可以部署炮兵部隊 一支炮兵部 隊在地圖上的攻擊範圍如圖中黑色區域所看到的 假設...
牧場的安排 狀態壓縮動態規劃模板題
problem description farmer john新買了一塊長方形的牧場,這塊牧場被劃分成m列n行 1 m 12 1 n 12 每一格都是一塊正方形的土地。fj打算在牧場上的某幾格土地裡種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當的貧瘠,不能用來放牧。並且,奶牛們喜歡獨佔一塊草...
炮兵陣地 poj1185,狀態壓縮的動態規劃
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 16673 accepted 6353 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 ...