以前沒做過這種型別的狀態壓縮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.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾...