poj 1185 炮兵陣地 狀態壓縮dp

2021-08-07 20:57:10 字數 1289 閱讀 6495

和 hdu 4539 鄭廠長系列故事——排兵布陣 差不多

先篩出來合法條件,攻擊範圍為上下左右兩個格仔,所以如果((i&(i<<1)) || (i&(i<<2)))為1,則為非法狀態。一共就60個左右。

然後先處理出來前兩行,再處理後邊的。

因為每一行的狀態只和前兩行有關,所以dp陣列為dp[r][i][j],表示在第r行,當前狀態為i,前一行狀態為j的情況下最多能放多少兵

#include

#include

int dp[101][101][101];

intrec[101];

int row[101];

int n,m;

int max(int a, int b)

int calc(int num)

return ret;

}bool check(int a, int b)

int main()

rec[k] = x;

char ch;

scanf("%d %d",&n,&m);

if(n == 0 || m == 0)

x = (1

}int res = 0;

/*先處理第一行*/

for(int i = 0; rec[i] < x; ++i)

if(!(rec[i]&row[0]))

if(n == 1)

/*處理第二行*/

for(int i = 0; rec[i] < x; ++i)

if(!(rec[i]&row[1]))

for(int j = 0; rec[j] < x; ++j)

if(!(rec[j]&row[0]))

if(check(rec[i],rec[j]))

if(n == 2)

for(int r = 2; r < n; ++r)

for(int i = 0; rec[i] < x; ++i)

if(!(rec[i]&row[r]))

for(int j = 0; rec[j] < x; ++j)

if(!(rec[j]&row[r-1]))

for(int k = 0; rec[k] < x; ++k)

if(!(rec[k]&row[r-2]))

if(check(rec[i],rec[j]) && check(rec[i],rec[k]) && check(rec[j],rec[k]))

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

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列組成,地圖的每一格可能是山地...

POJ1185 炮兵陣地 狀態壓縮DP

感覺和3254很像,不過這次的間隔變成兩格,當前行的狀態與上兩行的狀態有關。狀態轉移方程 dp k q i max dp k q i dp q j i num k num k 表示狀態k的炮兵數量 dp k q i 表示當前第i行為狀態k上一行的狀態為q的炮兵數量總數。炮兵陣地 time limit...