本題過於經典......
對於這種網格狀壓dp,套路一波刷表法dfs轉移就沒了。
三進製狀壓,0表示當前,上乙個都沒有。1表示當前無,上乙個有。2表示當前有。
轉移的條件就是上一行為0,當前不是山地,且左邊兩個都不是2。
注意有個坑點,全部轉移會超時。因為本題有很多廢狀態(山地),初始化-1然後判斷是否轉移即可。
1 #include 2 #include 3 #include 4ac**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 }
我陣列一開始開了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 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在...