題目描述
司令部的將軍們打算在n*m的網格地圖上部署他們的炮兵部隊。乙個n*m的地圖由n行m列組成,地圖的每一格可能是山地(用「h」 表示),也可能是平原(用「p」表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:
如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。 現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
輸入輸出格式
輸入格式:
第一行包含兩個由空格分割開的正整數,分別表示n和m;
接下來的n行,每一行含有連續的m個字元(『p』或者『h』),中間沒有空格。按順序表示地圖中每一行的資料。n≤100;m≤10。
輸出格式:
僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。
輸入輸出樣例
輸入樣例#1:
5 4phpp
pphh
pppp
phpp
phhp
輸出樣例#1:
6演算法:
狀壓dp
分析:
這個題跟corn fields也很像,只不過一道是講方案可行數,這個是講最大值(其實就是所有的可行數)。所有還是選擇狀壓dp。
不過這道題難在他很麻煩,因為他會向四周延伸2格,所以初始化的時候要左移1位和左移2位判斷。而存狀態的時候需要把當前行和上一行一起存了。再迴圈上上行。
其他就與普通狀壓沒什麼不同了。
不過有個坑點,讀入字元的時候要格外小心,我就因此wa了好多次,大家可以憑經驗選擇。
我還使用了乙個滾動陣列來優化這個程式。經觀察可得這一行的內容只與他的上一行內容有關,所以我原本的dp[i][state1][state2]的i只需要存兩個即可。所以還是用位運算優化,zyy大佬曾經告訴過我,假如滾動陣列用異或的話不但跑得快,而且寫得方便,所以這裡就用了異或來存陣列。
上**:
1 #include2 #include3這道題我交洛谷是可以a的,但是玄學的是交poj是wa的。我考慮過是不是當前行狀態和上一行狀態的先後問題,但經試驗證明是沒關係的,具體原因我也搞不清,請各位大神指出。#define c continue
4using
namespace
std;56
char ch[11];7
int n,m,state[1025],cur[110],dp[2][1025][1025],ans,sum,fire[1025];8
bool flag; //
滾動陣列
910 inline void init() //
初始化1121}
2223 inline bool fit(int x,int k) //
當前狀態是否滿足當前行
2427
28int
main()
2941 flag=1;42
for (i=1;i<=sum;i++) //
預處理第一行
43if (fit(i,1
))44 dp[flag][i][1]=fire[i];
45 flag^=1;46
for (i=1;i<=sum;i++) //
預處理第二行
4753
for (i=3;i<=n;i++) //
枚舉行5470}
71}72}
73for (j=1;j<=sum;j++)
74for (k=1;k<=sum;k++)
75 ans=max(ans,dp[flag][j][k]);
76 printf("%d"
,ans);
77return0;
78 }
嗯,就這樣了。
洛谷 P2704 NOI2001 炮兵陣地
給出n m的地圖,有很多空地p跟山地h,炮台可以攻擊周邊 求最多能放多少個炮台並且他們互不攻擊。n 100 m 10 這題是狀壓dp的一道經典題目,對於每行10個東東可以放就是2 10種可能,這樣轉移就會tle 所以我們發現因為任意2個炮之間距離至少為2,所以我們每行存在的可行狀態至多不超過2 5 ...
《洛谷P2704 NOI2001 炮兵陣地》
非常細細細的一題。首先,這資料量顯然是狀壓。dp i j k 表示 到第i行,第i行狀態為j,第i 1行狀態未k的最大方案數。我們從上向下考慮的話,每個放置的棋子會被上面兩行棋子的放置狀態所影響。所以我們每次轉移的時候需要列舉上面的兩行。這樣的話複雜度就是 n m m m。這顯然已經超了 但是正解還...
洛谷 P2704 NOI2001 炮兵陣地
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...