司令部的將軍們打算在n∗m
n*mn∗
m的網格地圖上部署他們的炮兵部隊。乙個n∗m
n*mn∗
m的地圖由n
nn行m
mm列組成,地圖的每一格可能是山地(用'h'
表示),也可能是平原(用'p'
表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍是其四個方向2
22格及以內。如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
輸入格式:
第一行包含兩個由空格分割開的正整數,分別表示n
nn和m
mm;接下來的n
nn行,每一行含有連續的m
mm個字元('p'
或者'h'
),中間沒有空格。按順序表示地圖中每一行的資料。
輸出格式:
僅一行,包含乙個整數k
kk,表示最多能擺放的炮兵部隊的數量。
資料範圍:
n
≤100,m
≤10
n≤100,m≤10
n≤100,
m≤10
思路是動態規劃,可以用狀態壓縮存每行的炮兵放的狀況,即用乙個整數的二進位制位來存,1
11表示有炮兵,0
00表示沒炮兵。設f[i
][j]
[k
]f[i][j][k]
f[i][j
][k]
為只擺前i
ii行,第i−1
i-1i−
1行的狀態是j
jj,第i
ii行的狀態是k
kk的情況下,最多能放多少個炮兵。那麼可以按照第i−2
i-2i−
2行是怎麼放的來分類,則有:f[i
][j]
[k]=
maxp∧
jf[i][j][k]=\max_\
f[i][j
][k]
=p∧j
max
其中c (k
)c(k)
c(k)
是k
kk的二進位制表示裡1
11的個數,並且p
pp遍歷所有與j
jj無矛盾的合法狀態。可以先預處理出來所有的行的合法狀態,並預處理每個狀態的1
11的個數。空間方面可以用滾動陣列優化。**如下:
#include
#include
using
namespace std;
const
int n =
11, m =
1<<10;
int n, m;
// 存輸入,g[i]的各個二進位制位表示第i行的地理情況,1表示有山,0表示無山
int g[
110]
;// 存行的合法狀態
vector<
int> state;
int f[2]
[m][m]
;int cnt[m]
;// 判斷st是否是行合法狀態
bool
check
(int st)
// 存st的二進位制表示裡有多少個1
intcount
(int st)
return res;
}int
main()
for(
int i =
0; i <
1<< m; i++)if
(check
(i))
for(
int i =
1; i <= n; i++
)for
(int j =
0; j < state.
size()
; j++
)for
(int k =
0; k < state.
size()
; k++
)for
(int u =
0; u < state.
size()
; u++
)int res =0;
for(
int j =
0; j < state.
size()
; j++
)for
(int k =
0; k < state.
size()
; k++
) res =
max(res, f[n &1]
[j][k]);
cout << res << endl;
return0;
}
時間複雜度o(n
23n)
o(n2^)
o(n23n
),但是實際沒有這麼高,因為行合法的狀態數量遠遠小於2
n2^n
2n,空間o(n
22n)
o(n2^)
o(n22n
)。
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 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...