狀態壓縮DP(二)

2021-06-22 18:01:57 字數 2051 閱讀 7585

以前沒做過這種型別的狀態壓縮dp,剛開始看著沒想明白,後來跟著**看著好多了。

題目:poj1185

炮兵陣地

題意:乙個矩陣,有一些地方可以放大炮,有的地方不能放,大炮對上下左右的攻擊範圍都是兩格。兩個大炮不能互相攻擊到,問最多放多少大炮。

思路:求出每一行的所有狀態數,即用二進位制表示的所有可行狀態(1010,選第乙個和第三個)。大炮的攻擊距離是2,所以本行、上一行、上上一行不能有大炮在同一行。遍歷本行、上一行、上上一行,計算並記下可行狀態的結果。

**:

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define for(i,a) for(i=0;i=b;i--)

#define pb push_back

#define inf 0x7fffffff

int n, m;

int cnt[120];

int now[102],last[102],lastlast[102];

int dp[120][120], lastdp[120][120];

char g[102][12];

int nowsize, lastsize, lastlastsize;

void init(int i, int j, int p, int sum)

if( g[i][j] == 'p' ) init(i, j+3, p|1<

題目:acdream chess

題意:有乙個棋盤,棋盤上有些點能放棋子,有些點不可以。乙個棋子能夠控制相鄰的四個位置,兩個棋子不能互相控制。求最少多少個棋子能控制全盤?

思路:先學的上面的,根據上面的思路卡在了控制全盤。需要在上面的**上加入控制的狀態,nowvis[i][j] 本行選i上一行選j本行能控制的格仔狀態。now[i]和last[j]計算的時候上面一行要全部控制到,因為在下面一行不可能控制到last[j]行。最後求全控制的最小值。群裡面大神用dancing links 做的,正在學習中……

**:#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define for(i,a) for(i=0;i=b;i--)

#define pb push_back

#define inf 0x7fffffff

int ans;

int n, m, all;

bool g[10][10];

int last[100],now[100];

int lastsize, nowsize, lastlastsize;

int cnt[100],dp[110][110],lastdp[100][110];

int bit[10],nowvis[110][110],lastvis[110][110];

int getbit(int p)

if( bit[0] == 1) res |= 3;

for(int j = 1; j < i; j ++) if(bit[j] == 1) res |= 7return res;

}void init(int i, int j, int p, int sum)

if( g[i][j] == 0 ) init(i, j+2, p|1<> n >> m)

last[0] = dp[0][0] = lastdp[0][0] = 0;

lastvis[0][0] = all;

lastsize = lastlastsize = 1;

dp();

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

} if( ans > 100) cout << -1 << endl;

else cout << ans << endl;

} return 0;

}

狀態壓縮DP

首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...

狀態壓縮DP

theme 給定乙個n m的玉公尺田,1 n,m 12。值為0表示不能在該塊種草,為1表示可以。現在要在其上中若干草地,要求任意草地間不相鄰 沒有公共邊 問不考慮草地個數的情況下,有多少種種植的方案?solution 用dp。又範圍很小,所以考慮狀態壓縮dp,另dp i j 表示從前i行種植,最後一...

狀態壓縮DP

總結狀壓dp轉移的方法 若某個狀態下可以對下 1.按二進位制讀入資料 2.列舉所有方案,如果合理 一行中沒有兩兩相鄰的 就儲存 i i 1 3.因為每一層的狀態只受上一層影響,因此迴圈兩次所有合理方案,為每乙個方案找到一系列下一層合理方案 4.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾...