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...