poj 1185 炮兵陣地

2021-08-21 15:56:27 字數 1785 閱讀 2632

poj1185 炮兵陣地

題 意:給你乙個n*m的舉證,分別輸入p和h(大寫),只有p可以放炮兵,炮兵的攻擊範圍是以他為中心,前後上下各兩個格仔。問在炮兵互補傷害的前提下,最多能部署多少炮兵。

數值範圍:

1 < n <= 100

1 < m < 10

樣例輸入:

5 4

phpp

pphh

pppp

phpp

phhp

樣例輸出:

6
思 路:狀壓dp,每一排的狀態之和前兩排的狀態相關。

關鍵點: 永遠都不要忘記,dp是記錄的所有的狀態

dp定義dp[i][j][k],i表示第i行狀態為j,前一行狀態為k的最多炮兵數

初始狀態:這個**裡面詮釋的更好

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

#include

#include

#include

using

namespace

std;

const

int maxn = 1e2 + 10;

typedef

long

long ll;

int dp[maxn][100][100]; //dp[i][j][k] 第i行的狀態為j第i-1行的狀態為k

int cur[100];

int state[maxn];

int number[100];

int total;

char s[15];

int n,m;

void init()

int getsum(int temp)

void initcase()

}}int main()}}

initcase();

for(int i=0;iif(!(state[i] & (~cur[0])))

}//dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][t])

for(int i=1;ifor(int j=0;j//第i行的狀態

if((state[j]&(~cur[i])))continue;

for(int k=0;kif((state[k]&(~cur[i-1])))continue;

if(state[j] & state[k]) continue;

for(int t=0;tif(state[t] & state[j]) continue;

if(state[t] & state[k]) continue;

if(dp[i-1][k][t] == -1) continue;

dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][t] + number[j]);}}

}}int res = -1;

for(int i=0;ifor(int j=0;jif(dp[n-1][i][j] >res)}}

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

}return0;}

/*3 3

3 31 4

1 5*/

poj 1185 炮兵陣地

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

POJ 1185 炮兵陣地

include include include include include include include include include include include include include include define sz v int v size define rep i,n ...

POJ 1185 炮兵陣地

狀態壓縮專題第一題,自己想了很久,最終還是以別人的 為模板寫的。dp共三維,一維是行數,一維是前一行狀態,一維是前第二行狀態。ps 直接開三維太大,用s陣列記錄下所有可能出現的情況,大大減少時間和空間。include include include includeusing namespace st...