abc190E - Magical Ornament
Description
有 $n(n\le 10^5)$ 对数字可以两两相邻,问你能不能排列出一个包含一串数 $c\ \ \ |c|\le 17$ 的序列,且序列长度最小。
Solution
建图:相邻点对连边,把题意转化成在该图上跑出一个最短路径包含序列中的所有点(点可重复)。
走的点的先后顺序未知,所以我们只能通过bfs得到单次从s开始到各点的最短路径,下一步要考虑顺序问题。
$dp[i][j]$ 表示走完 $i$ 中二进制为 1 的点,最后一步是标号为 j 的点的最优解。如 $dp[7][2]$ ,7即二进制下111,代表在这我走完这3个点时,最后一步是第二个点。 也就是前一步是101, 最后一步完成后转移到111。 这样,我们的状态转移方程就是:$dp[nextState][last] = min(dp[nextState][last], dp[i][j] + dis[j][last])$
表示下一个状态集合以last为结尾的最优解,由当前状态加上j到last两点间距转移过来。最后遍历一遍到达末状态11111…11(k个1)时最后一步的各个情况来取最小值即可。
Code
1 | int n , m , k , x, y , vis[maxn], d[maxn], a[maxn], dp[maxn][20]; |