Poj 1185 炮兵陣地(狀態壓縮dp 入門題)

2021-06-26 19:17:00 字數 2131 閱讀 2922

炮兵陣地

time limit:2000ms

memory limit:65536k

total submissions:17272

accepted:6593

description

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

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

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

input

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

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

output

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

sample input

5 4

phpp

pphh

pppp

phpp

phhp

sample output

6
思路:狀態壓縮,用二進位制表示各個位置的狀態,然後列舉。就是對每一行用1和0表示各個位置是「p」還是「h」,之後用mp[i]存下這個二進位制轉換成十進位制的數。

然後就是列舉所有的情況。

dp[i][j][k]表示第i行,當前j狀態,i-1行是k狀態時候的最大炮數

dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][p]+sum[j]).

細節還是得自己理解。。

#include#include#include#include#include#include#include#include#include#include#include#include#define n 100010

#define mod 10000007

#define lson l,mid,idx<<1

#define rson mid+1,r,idx<<1|1

#define lc idx<<1

#define rc idx<<1|1

const double eps = 1e-11;

const double pi = acos(-1.0);

const double e=2.718281828;

typedef long long ll;

const int inf=1000010;

using namespace std;

int mp[102];///記錄每一行狀態,例:hpph 用 1001 表示,mp[i]則記錄mp[i]=9=2^3+2^0;

int sum[103],cnt[102];///sum記錄的是每種情況1的個數,cnt則是記錄對應的值

int n,m,len,dp[110][110][110];

bool ok(int x)///判斷x的情況是否存在衝突,即左右一位和兩位有沒有1的重疊

int getsum(int x)///符合條件的x,計算1的個數

return ans;

}void finds()///預處理0~2^m的所有情況

{ memset(cnt,0,sizeof cnt);

len=0;

for(int i=0; in>>m)

{char c;

getchar();

for(int i=0; i

poj1185 炮兵陣地(狀態壓縮)

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

poj 1185炮兵陣地(狀態壓縮)

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

POJ1185 炮兵陣地 狀態壓縮DP

感覺和3254很像,不過這次的間隔變成兩格,當前行的狀態與上兩行的狀態有關。狀態轉移方程 dp k q i max dp k q i dp q j i num k num k 表示狀態k的炮兵數量 dp k q i 表示當前第i行為狀態k上一行的狀態為q的炮兵數量總數。炮兵陣地 time limit...