/*
炮兵陣地
time limit: 2000ms
memory limit: 65536k
total submissions: 16673
accepted: 6353
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 4phpp
pphh
pppp
phpp
phhp
sample output
6source
noi 01
解析:思路:典型的狀態壓縮的動態規劃
一,狀態壓縮:
1.首先對當前初始可行狀態進行壓縮,用二進位制記錄,當i位置可以放炮兵部隊時,
該位置置1,否則為0。(最後結果也是計算1的最大個數)
2.尋找每一行所有的可行性狀態並記錄下來
二,動態規劃
1.動態方程:dp[i][j][k]=max+one[s[i][j]];
其中,dp[i][j][k]表示第i行的第j個狀態,第i-1的第k狀態的計量值
s[i][j]表示第i行第j個狀態值
one[s[i][j]]則表示第i行第j個狀態中1的個數
2.剪枝判斷:求解過程中還需判斷當前行是否與前面兩行沒有衝突
3.進一步優化結果
2324k
282ms
c++2270b
*/
#include#include#include#include#include using namespace std;
const int maxn=110;
int one[maxn*20];
int s[maxn][maxn],sn[maxn];
int dp[maxn][70][70];
char ch[maxn];
int n,m;
int max(int a,int b)
void getone()//得到每種狀態下1的個數
void getlawstate(int x, int p)//得到第x行的在列方向上的全部合法狀態並記錄
}}int main()
getlawstate(i,p);
}for(i=1;i<=sn[1];i++)//處理第一行
}for(i=2;i<=n;i++)
}dp[i][j][k]=t+one[s[i][j]];}}
}}
for(i=1;i<=sn[n];i++)
for(j=1;j<=sn[n-1];j++)
printf("%d\n",ans);
}return 0;
}
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列組成,地圖的每一格可能是山地...
炮兵陣地 POJ 1185
司令部的將軍們打算在nm的網格地圖上部署他們的炮兵部隊。乙個nm的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰色所...