這一道題限制條件有點多,我們需要逐個擊破:
首先要判斷這一格是否為山地,這個可以狀態壓縮
然後我們的左右一定距離不能有炮兵,這是乙個突破口,因為我們看資料發現每行不超過十個格仔!這樣的話我們完全可以預處理出來每一行的填充方案而且這些方案肯定很少!
某一格的前面兩格也不能有炮兵。這個限制最麻煩,他涉及了前兩行,我們如果要從第一行開始向下推,那就必須知道前兩行的所有情況!但是這些在極小的資料範圍面前都可以想辦法解決。
這是這道題的三個關鍵點,然後我們可以想到用前兩行的狀態來dp,我們將前兩行全部壓縮起來(博主的壓縮方式比較複雜,因為他的資料n比較大,但我們之前已經分析過每一行的放置方案不會很多,所以我們可以離散化)。然後我們向下推的時候就比較顯然了,我們用前兩行的方案和這一行的山地的狀壓進行與運算,即可得到這一行哪些地方不能放炮兵,然後暴力列舉放置方案看哪一些符合然後轉移即可。詳細見**。
#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define db double
#define rg register int
using namespace std;
int n,m,t,tt,ans;
int f[105][10005],d[1050005];
int a[105],b[105],s[10005],ss[10005],sss[10005];
string c;
inline int qr()
inline void dfs(int i,int v)
dfs(i-3,v^(1<>=1;
}return res;
}int main()
} }for(rg i=1;i<=tt;++i) ans=max(f[n][i],ans);
printf("%d\n",ans-1);
return 0;
}
POJ1185(炮兵陣地) 狀壓DP
每一行的狀態是取決於上一行和上上一行的,所以每次更新的時候需要記錄當前行的狀態和下一行的狀態,然後再進行遞推。不過估算了一下複雜度是10的11次方,嚇得我都沒敢寫啊!看了一下別人的部落格,居然真有這樣寫過的,於是就自己實現一邊啦 最後看了以下討論版,處理一下複雜度可以降低的,最後貼討論版 思路 令p...
POJ1185 炮兵陣地 狀壓dp
司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地 用 h 表示 也可能是平原 用 p 表示 如下圖。在每一格平原地形上最多可以布置一支炮兵部隊 山地上不能夠部署炮兵部隊 一支炮兵部隊在地圖上的攻擊範圍如圖中黑色區域所示 如果在地圖中的灰...
POJ 1185 炮兵陣地 狀壓DP
炮兵陣地 time limit 2000ms memory limit 65536k total submissions 25954 accepted 10004 description 司令部的將軍們打算在n m的網格地圖上部署他們的炮兵部隊。乙個n m的地圖由n行m列組成,地圖的每一格可能是山地...