loj 1406 狀態壓縮

2021-09-06 13:34:58 字數 1087 閱讀 7248

思路:首先可以預處理出在每個頂點的狀態的合法狀態vis[u][state], 然後標記那些合法狀態mark[state]。最後就是記憶化搜尋了,對於當前狀態state,我們有res = min(res, 1 + solve(state ^ substate)), 其中substate為state的子狀態,並且substate = (substate  - 1) & state.那麼最終就是要求solve((1 << n) - 1)了。

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;78

intn, m;

9bool vis[16][1

<< 16

];10

bool mark[1

<< 16

];11

int dp[1

<< 16

];12 vector g[16

];13

14void dfs(int u, int

state)

1523}24

}2526int solve(int

state)

2735}36

return dp[state] =res;37}

3839

40int

main()

4153 memset(vis, false, sizeof

(vis));

54 memset(mark, false, sizeof

(mark));

55for (int i = 0; i < n; i++) dfs(i, 1

<

56 memset(dp, -1, sizeof

(dp));

57 printf("

case %d: %d\n

", t++, solve((1

<< n) -1

));58}59

return0;

60 }

view code

loj 1406 狀態壓縮

思路 首先可以預處理出在每個頂點的狀態的合法狀態vis u state 然後標記那些合法狀態mark state 最後就是記憶化搜尋了,對於當前狀態state,我們有res min res,1 solve state substate 其中substate為state的子狀態,並且substate ...

狀態壓縮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行種植,最後一...