状压dp
dfs版本
倒着做1
2
3
4
5
6
7
8
9
10
11int dfs(int sta, int now) { // sta是当前的状态(二进制),now是当前的位置
if (~dp[sta][now]) return dp[sta][now];
int res = 0x3f3f3f3f;
for (int i = 0; i < n; i++) {
if (sta >> i & 1) {
res = min(res, dfs(sta ^ (1 << i), i) + (价值));
}
}
return dp[sta][now] = res;
}
正着做1
2
3
4
5
6
7for (int i = 1; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if (i >> j & 1) {
dp[i] = min(dp[i], dp[i ^ (1 << j)] + (价值));
}
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DarknessCatcher!