洛谷P2704 炮兵陣地

2022-04-30 13:33:14 字數 1146 閱讀 7757

本題過於經典......

對於這種網格狀壓dp,套路一波刷表法dfs轉移就沒了。

三進製狀壓,0表示當前,上乙個都沒有。1表示當前無,上乙個有。2表示當前有。

轉移的條件就是上一行為0,當前不是山地,且左邊兩個都不是2。

注意有個坑點,全部轉移會超時。因為本題有很多廢狀態(山地),初始化-1然後判斷是否轉移即可。

1 #include 2 #include 3 #include 4

5const

int n = 110, m = 12;6

7int n, m, f[n][200010

], pre[m], now[m], ans, g[n][m];

8char

str[m];

910 inline int zip(int *a)

15return

t;16}17

18 inline void unzip(int x, int *a)

23return;24

}2526void dfs(int x, int y, int

lastans)

33 dfs(x, y + 1

, lastans);

34if(!g[x][y] && pre[y] == 0 && (y < 1 || now[y - 1] < 2) && (y < 2 || now[y - 2] < 2

)) 39

return;40

}4142int

main() 50}

5152

int lm = 1;53

for(int i = 1; i <= m; i++)

56 f[0][0] = 0;57

for(int i = 0; i < n; i++)

62unzip(s, pre);

63for(int j = 0; j < m; j++)

66 dfs(i + 1, 0

, f[i][s]);67}

68}6970 printf("%d"

, ans);

71return0;

72 }

ac**

我陣列一開始開了2^m個......應該是3^m。

題解 P2704 炮兵陣地

這道題和p1879 usaco06nov 玉公尺田corn fields有類似的地方,但這道題可以看為那道題的公升級版,所以我建議沒做過玉公尺田的可以先做一下玉公尺田和p1896 scoi2005 互不侵犯king。解此題的關鍵在於要知道第i行的狀態是由前兩行的狀態決定的,所以要預處理出第一行和第二...

洛谷 P2704 NOI2001 炮兵陣地

給出n m的地圖,有很多空地p跟山地h,炮台可以攻擊周邊 求最多能放多少個炮台並且他們互不攻擊。n 100 m 10 這題是狀壓dp的一道經典題目,對於每行10個東東可以放就是2 10種可能,這樣轉移就會tle 所以我們發現因為任意2個炮之間距離至少為2,所以我們每行存在的可行狀態至多不超過2 5 ...

洛谷P2704 NOI2001 炮兵陣地

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