給出乙個n*n型的方格棋盤。乙個棋子放在其中乙個格仔裡,那麼他的8個方向都不能放棋子,限制最多擺放的棋子個數為m,問最多有多少種放法。
可以用乙個三維陣列來表示乙個狀態,表示所有前i行,已經擺了j個棋子,並且第i行擺放的狀態是s的所有方案。
判斷約束條件,一行內不能有兩個棋子相鄰,第i - 1行和第i行不能相互攻擊到。
即:(a & b) = 0, (a | b)不能有兩個相鄰的1
給乙個n*m的方格,在乙個地方種地,那麼在這個地方的十字形的範圍內不能種地。並且有部分地是壞的,不能種地。#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;
}
問能擺放方案的數量, 結果對1e8取模。
基本的限制條件和上面的相似。
同一行不能有相鄰的1,同一列不能有相鄰的1。
要考慮不能放的情況
給乙個n*m的方格,在乙個地方種地,那麼在這個地方的十字形四個方向長度為2的範圍內不能種地。並且有部分地是壞的,不能種地。#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;
}
求所有方案中的最大值。
同一行不能有相鄰的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 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...