poj 1185 炮兵陣地(動態規劃 狀壓DP)

2021-06-25 14:15:39 字數 558 閱讀 5286

用二進位制數表示一行的狀態

預處理記錄滿足條件的狀態對應十進位制數

因為當前行僅與上兩行有關,所以狀態轉移方程為:

dp[i][k][t] = max(dp[i][k][t], dp[i-1][j][k]+num[t])

num[t]表示狀態t對應的炮台數

dp[i][k][t]表示第i行狀態為t,第i-1行狀態為k時對應的最大值

**如下:

#include #include #include #define maxn 100

using namespace std;

int m, n, top;

int dp[120][maxn][maxn];

int state[maxn], num[maxn];

int cur[120];

char str[maxn];

bool ok(int x)

int count(int x)

return cnt;

}void init() {

top = 0;

int total = 1<

POJ 1185 炮兵陣地 動態規劃 狀態壓縮

由於遞推的時候依賴於三個連續層的關係.一開始想著直接三重for迴圈,但是這裡有個問題就是上一層的0位置上包括著上上層是0和1兩種可能,而後者又對當前行有約束,因此該方法不行.當然有乙個辦法就是增加狀態數,讓狀態能夠表示是從1還是從0轉移過來的.這題有個解法是採用多進製的狀態壓縮 網上瞄了別人的一眼解...

POJ 1185 炮兵陣地(動態規劃 狀態壓縮)

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

poj 1185 炮兵陣地

題目鏈結 題意 在n m的網格地圖上部署炮兵部隊。地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所標識的平原上部署一支炮兵部隊,則圖中...