題面
司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地(用"h" 表示),也可能是平原(用"p"表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:
如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。 現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
輸入
第一行包含兩個由空格分割開的正整數,分別表示n和m; 接下來的n行,每一行含有連續的m個字元(『p』或者』h』),中間沒有空格。按順序表示地圖中每一行的資料。
輸出
僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。
樣例輸入
5 4phpp
pphh
pppp
phpp
phhp
樣例輸出
6提示
n
<
=100;m
<=10
。n <= 100;m <= 10。
n<=1
00;m
<=1
0。sol
很水的狀壓dp。
這道題看似令人頭疼,實際上只需轉化成兩種情況——豎著的和橫著的,且只需要考慮相鄰3行。
於是只需要考慮兩種衝突——當前行和前兩行的同一列,當前行的相鄰3個。
很多衝突可以進行預處理,但我沒有預處理,大家如果要卡常可以多寫些預處理。
**:
#include
#define lowbit(x) (x&-x)
#define int long long
#define n 10
using
namespace std;
inline
intrd()
int f[3]
[1<
<
,sum[
1<
,ok[
100]
,tot,n,m;
char ch[20]
;inline
void
write
(int x)
inline
bool
check
(int x)
signed
main()
}for
(int
register i=
0;i<=tot;i++)}
for(
intregister t=
0;t<=tot;t++)if
(check
(t)&&
!(t&ok[0]
))f[0]
[t][0]
=sum[t]
;for
(int
register t=
0;t<=tot;t++
)for
(int
register j=
0;j<=tot;j++)if
(check
(t)&&
check
(j)&&
!(t&ok[0]
)&&!(j&ok[1]
))f[1]
[j][t]
=sum[j]
+sum[t]
;for
(int
register i=
2;i)for
(int
register pre=
0;pre<=tot;pre++)}
}int
register ans=
0ll;
for(
intregister i=
0;i<=tot;i++
)for
(int
register j=
0;j<=tot;j++
)ans=
max(ans,f[
(n-1)%
3][i][j]);
write
(ans)
;puts(""
);return0;
}
1185 炮兵陣地
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 2762 accepted 776 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 ...
1595 炮兵陣地
1595 炮兵陣地 時間限制 1000 ms 記憶體限制 524288 kb 提交數 503 通過數 322 題目描述 原題來自 noi 2001 司令部的將軍們打算在 n m 的網格地圖上部署他們的炮兵部隊。乙個 n m 的地圖由 n 行 m 列組成,地圖的每一格可能是山地 用 h 表示 也可能是...
poj 1185 炮兵陣地
題目鏈結 題意 在n m的網格地圖上部署炮兵部隊。地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...