動態規劃之四 狀壓dp

2021-10-18 02:43:47 字數 3406 閱讀 9362

給出乙個n*n型的方格棋盤。乙個棋子放在其中乙個格仔裡,那麼他的8個方向都不能放棋子,限制最多擺放的棋子個數為m,問最多有多少種放法。

可以用乙個三維陣列來表示乙個狀態,表示所有前i行,已經擺了j個棋子,並且第i行擺放的狀態是s的所有方案。

判斷約束條件,一行內不能有兩個棋子相鄰,第i - 1行和第i行不能相互攻擊到。

即:(a & b) = 0, (a | b)不能有兩個相鄰的1

#include

using

namespace std;

typedef

long

long ll;

const

int n =

12, m =

1<<

10, k =

110;

const ll inf =

0x3f3f3f3f

;int n, m;

//n表示棋盤大小,m表示棋子個數

vector<

int> state;

vector<

int> head[m]

;//記錄每個狀態可以轉移到的所有其他狀態

ll f[n]

[k][m]

;int cnt[m]

;bool

check

(int state)

intcount

(int state)

intmain()

for(

int i =

0; i < state.

size()

; i ++)}

/**************動態規劃***************/

f[0]

[0][

0]=1

;for

(int i =

1; i <= n +

1; i ++

)for

(int j =

0; j <= m; j ++

)for

(int a =

0; a < state.

size()

; a ++

)for

(auto b = head[a]

.begin()

; b != head[a]

.end()

; b ++

) cout << f[n +1]

[m][0]

<< endl;

}

給乙個n*m的方格,在乙個地方種地,那麼在這個地方的十字形的範圍內不能種地。並且有部分地是壞的,不能種地。

問能擺放方案的數量, 結果對1e8取模。

基本的限制條件和上面的相似。

同一行不能有相鄰的1,同一列不能有相鄰的1。

要考慮不能放的情況

#include

using

namespace std;

typedef

long

long ll;

const

int n =

14, m =

1<<

12, mod =

1e8;

const ll inf =

0x3f3f3f3f

;int n, m;

vector<

int> state;

vector<

int> head[m]

;int g[n]

;int f[n]

[m];

bool

check

(int state)

intmain()

for(

int i =

0; i <

1<< m; i ++)if

(check

(i))

state.

push_back

(i);

for(

int i =

0; i < state.

size()

; i ++

)for

(int j =

0; j < state.

size()

; j ++

) f[0]

[0]=

1;for(

int i =

1; i <= n +

1; i ++

)for

(int a =

0; a < state.

size()

; a ++

)for

(int b : head[a]

) cout << f[n +1]

[0]<< endl;

}

給乙個n*m的方格,在乙個地方種地,那麼在這個地方的十字形四個方向長度為2的範圍內不能種地。並且有部分地是壞的,不能種地。

求所有方案中的最大值。

同一行不能有相鄰的1,同一列不能有相鄰的1。

要考慮不能放的情況

#include

using

namespace std;

typedef

long

long ll;

const

int n =

11, m =

1<<10;

const ll inf =

0x3f3f3f3f

;int n, m;

int g[

110]

;vector <

int> state;

int f[2]

[m][m]

;//滾動陣列

int cnt[m]

;bool

check

(int state)

intcount

(int state)

intmain()

for(

int i =

0; i <

1<< n; i ++)}

for(

int i =

1; i <= n +

2; i ++

)for

(int j =

0; j < state.

size()

; j ++

)for

(int k =

0; k < state.

size()

; k ++

)for

(int u =

0; u < state.

size()

; u ++

) cout << f[n +2&

1][0

][0]

<< endl;

}

狀態壓縮動態規劃(狀壓DP)

狀態壓縮動態規劃就是我們常說的狀壓dp,前兩天某廠實習生二面面試官隨手就給我抽了一道狀壓dp的題,我根本沒思路,sorry就寫了一行注釋。然後leetcode周賽最後一題又碰到了狀壓dp的題目,我一定要搞定這個型別的問題。加油加油 狀壓dp說簡單也簡單,基本上就是用一串二進位制樹來表示當前情況 的狀...

動態規劃 UPC 7780(狀壓DP)

時間限制 2 sec 記憶體限制 128 mb 題目描述 給定一張 n n 20 個點的帶權無向圖,點從 0 n 1 標號,求起點 0 到終點 n 1 的最短hamilton路徑。hamilton路徑的定義是從 0 到 n 1 不重不漏地經過每個點恰好一次。輸入第一行乙個整數n。接下來n行每行n個整...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...