洛谷 P2704 NOI2001 炮兵陣地

2022-08-23 07:00:15 字數 1635 閱讀 8111

司令部的將軍們打算在n*m的網格地圖上部署他們的炮兵部隊。乙個n*m的地圖由n行m列組成,地圖的每一格可能是山地(用「h」 表示),也可能是平原(用「p」表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示:

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。 現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

第一行包含兩個由空格分割開的正整數,分別表示n和m;

接下來的n行,每一行含有連續的m個字元(『p』或者『h』),中間沒有空格。按順序表示地圖中每一行的資料。n≤100;m≤10。

僅一行,包含乙個整數k,表示最多能擺放的炮兵部隊的數量。

輸入樣例#1: 複製

5 4

phpp

pphh

pppp

phpp

phhp

輸出樣例#1: 複製

6

#include#define n 100000000 

using

namespace

std;

int f[100001],sta[100001

];int ff[105][1500][1500

];int sum[1500

];int b[1500

];int find(int

x)

return

ans;

}int

main ()

int maxn=(1

<1

;

int cnt=0

;

for (int i=0;i<=maxn;i++)

for (int i=0;i<=maxn;i++)

sum[i]=find(i);

for (int i=1;i<=n;i++)

for (int j=1;j<=cnt;j++)

ff[i][b[j]][

0]=sum[b[j]];

for (int i=2;i<=m;i++)

for (int j=1;j<=cnt;j++)

if ((b[j]&f[i])==b[j])

for (int k=1;k<=cnt;k++)

if ((b[k]&f[i-1])==b[k])

for (int l=1;l<=cnt;l++)

if ((b[l]&f[i-2])==b[l])

int ans=0

;

for (int i=0;i<=maxn;i++)

for (int j=0;j<=maxn;j++)

ans=max(ff[n][i][j],ans);

cout

<

}

洛谷 P2704 NOI2001 炮兵陣地

給出n m的地圖,有很多空地p跟山地h,炮台可以攻擊周邊 求最多能放多少個炮台並且他們互不攻擊。n 100 m 10 這題是狀壓dp的一道經典題目,對於每行10個東東可以放就是2 10種可能,這樣轉移就會tle 所以我們發現因為任意2個炮之間距離至少為2,所以我們每行存在的可行狀態至多不超過2 5 ...

洛谷P2704 NOI2001 炮兵陣地

題目描述 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在...

《洛谷P2704 NOI2001 炮兵陣地》

非常細細細的一題。首先,這資料量顯然是狀壓。dp i j k 表示 到第i行,第i行狀態為j,第i 1行狀態未k的最大方案數。我們從上向下考慮的話,每個放置的棋子會被上面兩行棋子的放置狀態所影響。所以我們每次轉移的時候需要列舉上面的兩行。這樣的話複雜度就是 n m m m。這顯然已經超了 但是正解還...