司令部的將軍們打算在\(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。這顯然已經超了 但是正解還...