1 条题解
-
0
题目大意
给定 个节点的有向图,边有正权。求从节点 到节点 的最长简单路径(不重复经过节点)。
算法思路
核心思想
状态压缩动态规划,利用 的条件,用二进制位表示已访问的节点集合。
状态设计
设 f[x][S] 表示当前位于节点 ,已访问节点集合为 (二进制状态)时,能获得的最大路径长度。
状态转移
对于当前状态 (x, S),枚举所有从 出发的边 :
如果 不在集合 中(即 S & (1<<v) == 0)
则转移:f[x][S] = max(f[x][S], f[v][S|(1<<v)] + w)
边界条件
当 x == n-1 时,返回 (已到达终点)
初始调用:dp(0, 1)(从节点 出发,已访问节点 )
算法流程
读入建图:用邻接表存储有向边
记忆化搜索:从起点 开始递归计算
输出结果:f[0][1] 即为答案
复杂度分析
状态数:
转移复杂度:
总复杂度:
在 时可行
总结
本题是状态压缩DP的经典应用:
状态设计:用二进制位表示节点访问情况
记忆化搜索:避免重复计算相同状态
有向图处理:沿有向边进行状态转移
最长路径:与最短路径对称,将 min 改为 max
这种"状态压缩 + 记忆化搜索"的方法适用于小规模图的路径计数和优化问题,是解决NP难问题的有效近似方法。
- 1
信息
- ID
- 4765
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者