POJ 1185 炮兵陣地 狀壓DP

2021-09-27 08:26:42 字數 1912 閱讀 5243

description

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

如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中的黑色的網格表示它能夠攻擊到的區域:沿橫向左右各兩格,沿縱向上下各兩格。圖上其它白色網格均攻擊不到。從圖上可見炮兵的攻擊範圍不受地形的影響。

現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊範圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。

input

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

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

output

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

思路:可以發現我們不僅要考慮當前行的狀態,還要考慮前兩行的狀態,所以我們設狀態dp[i][j][k]就表示第i行狀態為j,第i-1

行狀態為k時前i行的答案,單純列舉狀態肯定是不行的。所以我們要預處理一下,找出來那些滿足' 任意兩個炮塔無法相互攻擊'

的狀態,放入集合s,那麼我們列舉狀態i 就代表s[i] 這個狀態,還要預處理一下當前行什麼狀態是有效的,即可以放置炮塔的,

然後我們轉移就行了。

轉移的話我們考慮需要滿足什麼條件?當前行滿足,上一行滿足,前兩行也滿足,並且任意兩行都不能有交集

那麼 dp[i][j][k] = max(dp[i - 1][k][s])  + num[j]  

#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 1e2 + 10;

const int inf = 0x3f3f3f3f;

int mp[maxn];

int dp[maxn][maxn][maxn], s[maxn], num[maxn];

bool vis[maxn][maxn];

int tot = 0, n, m;

void init()

last = j;}}

if(flag) s[++tot] = i;

}for(int i = 0; i <= n; ++i) //vis[i][j]判斷第i行狀態為s[j]時是否合法

bool flag = true;

for(int k = 0; k < m; ++k)

}vis[i][j] = flag;}}

for(int i = 1; i <= tot; ++i) //統計狀態s[i]二進位制1的個數

}int main()

}init();

memset(dp, -0x3f, sizeof(dp));

dp[0][0][0] = 0;

int ans = 0;

for(int i = 1; i <= tot; ++i) //特殊考慮第一行

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

dp[i][s][j] += num[s];

if(i == n) //目標狀態

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

}}}printf("%d\n", ans);

return 0;

}

POJ1185(炮兵陣地) 狀壓DP

每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...

POJ1185 炮兵陣地 狀壓dp

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

POJ 1185 炮兵陣地 狀壓DP

炮兵陣地 time limit 2000ms memory limit 65536k total submissions 25954 accepted 10004 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...