ACWing 292 炮兵陣地

2021-10-21 10:29:04 字數 2715 閱讀 1175

司令部的將軍們打算在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]=

max⁡p∧

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 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...