題目鏈結
明明是道狀壓dp的題我為啥非要用插頭dp亂搞啊
逐行列舉,設dp[i][s]為列舉到第i個格仔時,狀態為s的情況。s為當前行上的「插頭」狀態,每兩個二進位制位表示乙個格仔,設當前格仔為(x,y),則y之前的插頭表示左插頭,y之後的插頭表示上插頭,僅當當前格仔上沒有插頭時才能夠放置炮兵。轉移的大致流程為:列舉當前狀態->判斷是否可放置炮兵->更新右插頭狀態->更新上插頭狀態。
跑的速度還可以,雖然略輸於狀壓dp。如果合法狀態數不是那麼少的話,可能會比狀壓dp要快。
1 #include2 #include3using
namespace
std;
4 typedef long
long
ll;5
const
int n=100+10,inf=0x3f3f3f3f;6
char s[n][15];7
struct
hashmap
11void clear()
12int size()
13int& operator(int
x) 16 p[tot]=x,q[tot]=0,fa[tot]=u,nxt[tot]=hd[u],hd[u]=tot++;
17return q[tot-1
];18
}19 } dp[2
];20
intn,m;
21int
get(int s,int y)
22int set(int s,int y,int f)
23int max(int s,int y,int f)
24int sub(int s,int y)
25int put(int s,int
y) 30
void upd(int& x,int y)
31int
main() 43}
44int ans=0;45
for(int i=0; i1].size(); ++i)upd(ans,dp[(n*m)&1
].q[i]);
46 printf("
%d\n
",ans);
47return0;
48 }
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...