之前我们在讨论的dp形式当中, 大多数是对整数的动态规划, 然而对于集合而言呢 ? 我们使用 DFS 吗, 看起来也可以, 但是加上dp记忆 数组的 动态规划效率更高;
那么进一步讨论, 我们如何表示集合元素是否被使用的状态呢 ? 是通过康拓展开, next_permutation 吗??? 这个是全排列, 是有些重复的, 在 dfs bfs 当中有一些涉及, 但是我们为什么不把集合当中的选中与不选中当成两种状态呢? 那么我们可以使用一个数字, 他的二进制编码对应的 0 1来表示集合当中的元素是否被使用了!!
那么我们就来看挑战当中的旅行商问题, 对此笔者会加一些便于理解的解析:
首先我们明确: 这里面的 dp[S][v] 指的是 现在已经访问过的顶点的集合是S, 当前所在的顶点是 v,由点 v 出发,访问剩余的所有顶点, 最终回到顶点 0 所需要的权重最小值
那么我们就知道 dp [V] [0] = 0; V 表示的是所有的顶点集合;
那么dp 数组元素之间联系的关系呢? dp[S] [v] = min{ dp[S + u] [u] + d(v, u) } , 其中 u 不属于S;
所以说,就产生了以下的代码