C 炮兵陣地(壓狀dp 三維陣列)

2021-09-25 10:56:32 字數 2023 閱讀 1624

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

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

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

input

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

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

output

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

sample input

5 4phpp

pphh

pppp

phpp

phhp

sample output

6使用maze陣列記錄每行地圖的二進位制地形形態, 使用status和num陣列記錄m長度下每一種符合1相鄰兩個0的地形資訊,stauts記錄符合條件二進位制地形形態, num陣列記錄相對應的status中1的個數(即該地形下的炮台放置位置)。

使用三維數dp[i] [j] [k],第一維為第幾行, 第二維代表第i行狀態, 第三維代表第i-1行狀態。

轉移方程為 dp[i] [j] [k] = max(dp[i ][j] [k], dp[i-1] [k ][t] + num[j]);

其中j狀態要符合第i行地形, 即maze[i]&status[j] == 0, 說明j狀態下的1 都對應在maze地形上的0位置。

重點是dp[i-1] [k ][t], k代表i的上一行狀態, t代表i的上一行的上一行的狀態,我們的目的就是找出所有符合條件的k,t, 然後更新 dp[i] [j] [k] 。條件為(!(status[j]&status[k]) && !(maze[i-1] & status[k])) 和 f(!(status[t]&status[k])&&!(status[t]&status[j]) && !(status[t]& maze[i-2]))。 我們要先更新dp[1] [i][0], 更新圖中第一行, 由於dp[0]圖中其實是不存在的, 但是初始化都為0, 對第二行按照假裝存在執行,是不會產生影響的。

#include #include #include #include #define mod 100000000

#define mem(x) memset(x, 0, sizeof(x))

using namespace std;

int n, m;

int dp[105][70][70];

int maze[105];

int status[70];

int num[70];

int main()

num[len] = sumn;

status[len++] = i;}}

int t;

for(i = 0; i < len; i++)

if(!(maze[1]&status[i]))

dp[1][i][0] = num[i];

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

int maxx = 0;

for(i = 0; i < len; i++)

for(j = 0; j < len; j++)

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

printf("%d\n", maxx);

}return 0;

}

炮兵陣地 壓狀經典題

題目描述 炮兵陣地 time limit 2000ms memory limit 65536k total submissions 38992 accepted 14874 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格...

炮兵陣地(狀壓dp)

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

DP 狀壓 DP 炮兵陣地

狀態壓縮動態規劃和狀態機動態規劃 未更新 大體上來說都是通過另類的方式來儲存動態規劃中的狀態。狀壓dp其實可以分為 棋盤式 和 集合類 這篇是 棋盤式 或者叫 基於聯通性 的狀壓dp的一道經典例題 炮兵陣地的部落格。炮兵陣地這道非常經典的狀態壓縮dp題目是值得學習的,可以從中學習到 棋盤式 狀壓dp...