題意:在n×m的地圖上放置炮兵,每個炮兵的攻擊範圍是上下左右各延伸兩格,地圖上有一些位置為山地,不可以放置,問給出地圖可以放置炮兵的最多數量。
思路:狀態壓縮dp,如果當前第i行放置,由於考慮到炮兵的攻擊範圍,所以需要列舉前兩行的狀態,所以用dp[i][s1][s2]來表示第i行狀態為s1,上一行狀態為s2的最多炮兵放置數量。由於每一行地形不一定相同,所以先把每一行可行的狀態先預處理出來。然後再dp。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define rrep(i,j,k) for (int i=j;i>=k;i--)
#define clean(x,y) memset(x,y,sizeof(x))
#define ll long long
#define ull unsigned long long
#define inf 0x7fffffff
#define mod %100000007
int n,m;
int a[109][12];
vectorstate[109];
int now[109]; //每一行地圖的狀態
mapnum; //存每個狀態的人數
int dp[109][65][65];
void init()
{ num.clear();
int tot = 0;
rep(i,0,1<<10)
{if ( i & (i<<2) || i & (i<<1) ) continue;
int x = 0;
rep(j,0,9) if ( i & (1<
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...