炮兵陣地 壓狀經典題

2022-07-02 08:06:11 字數 2075 閱讀 2213

題目描述:

炮兵陣地

time limit:2000ms

memory limit:65536k

total submissions:38992

accepted:14874

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

思路:已經是二刷了,一刷的時候遞推用的是用的前面第二層來推,但是前二層的最優解可能會導致中間的有些狀態不能選擇,所以應該用上一層的最優解來推,這裡就不多廢話了

ac**:

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

const

int maxn = 20

;int

n, m;

int cnt = 0

;struct

node book[

80];

int dp[2][80][80

];void dfs(int pos, int now, int

num) ;

return

; }

dfs(pos + 1

, now, num);//不放炮兵

dfs(pos + 3, now + (1

<< pos), num + 1

);//該位置放炮兵

}int donot[100

];char

t;int

main()

}int f = 1

;

int ans = 0

;

if (n == 1)

cout

<< ans <

return0;

}for (int i = 0; i < cnt; i++)

}for (int s = 2; s ) }}

}for (int i = 0; i < cnt; i++)

}cout

<< ans <

return0;

}

炮兵陣地(狀壓dp)

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

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

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

DP 狀壓 DP 炮兵陣地

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