洛谷P2704 NOI2001 炮兵陣地題解

2022-03-14 22:18:49 字數 2077 閱讀 5172

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

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

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

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

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

5 4phpp

pphh

pppp

phpp

phhp

\(狀壓dp\)

\(dfs\)求出狀態和狀態數

設\(n[i][j]\)表示第i行第j個狀態所用的炮兵數量

設乙個轉移狀態\(dp[i][j][k]\)是當前的炮兵數

\(i\)表示第\(i\)行,\(j\)表示第\(i\)行第\(j\)個狀態,\(k\)表示第\(i-1\)行第\(k\)個狀態

方程也特別簡單

\(dp[i][j][k] = max(dp[i][j][k], dp[i-1][k][l] + n[i][j]);\)

然後列舉出第\(n\)行的所有狀態和第\(n-1\)行的所有狀態,取乙個\(max\)

但是會遇到乙個問題,就是陣列會開的很大,這時通過\(dfs\)發現

當全都是\(p\)時,也只有\(60\)種狀態,所以可以減小陣列.

#include #include #define re register

inline int read()

while(ch >= '0' && ch <= '9') s = (s << 3) + (s << 1) + ch - '0', ch = getchar();

return f == '-' ? -s : s;

}inline int max(int a, int b)

const int max = 12;

const int max = 102;

const int inf = 0x7fffffff;

int n, m, dp[max][65][65];

int st[max][65], sum[max], n[max][65];

char ch[max][max];

void dfs(int x, int sum, int j, int p)

dfs(x, sum, j + 1, p);

if(ch[x][j] == 'p') dfs(x, sum + (1 << j), j + 3, p + 1);

}int main()

for(re int i = 3; i <= n; ++ i)

for(re int j = 1; j <= sum[i]; ++ j)

for(re int k = 1; k <= sum[i-1]; ++ k)

for(re int l = 1; l <= sum[i-2]; ++ l)

int ans = -inf;

for(re int i = 1; i <= sum[n]; ++ i)

for(re int j = 1; j <= sum[n-1]; ++ j)

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

printf("%d",ans);

return 0;

}

洛谷 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。這顯然已經超了 但是正解還...