
动态规划与图论算法从入门到精通这些反模式最好早点避开算法代码常见的问题不是公式不会写而是把前提藏在实现里。图可能有环边权可能为负动态规划的状态也可能因为迭代方向错误而重复使用同一件物品。把这些前提写成校验与测试比事后排查更有效。图拓扑排序必须报告环Kahn 算法处理完的节点数小于总节点数意味着图中存在环或输入边集合不完整。它不应悄悄返回部分顺序。func TopologicalOrder(graph map[string][]string) ([]string, error) { indegree : make(map[string]int) for node, next : range graph { if _, ok : indegree[node]; !ok { indegree[node] 0 } for _, to : range next { indegree[to] } } queue, order : make([]string, 0), make([]string, 0, len(indegree)) for node, degree : range indegree { if degree 0 { queue append(queue, node) } } for len(queue) 0 { n : queue[0]; queue queue[1:]; order append(order, n) for _, to : range graph[n] { indegree[to]--; if indegree[to] 0 { queue append(queue, to) } } } if len(order) ! len(indegree) { return nil, errors.New(dependency graph contains a cycle) } return order, nil }DP压缩空间前先确认迭代方向0-1 背包压缩为一维数组时容量必须从大到小遍历从小到大遍历会把同一物品重复使用变成完全背包。测试应包含单物品、容量为零、价值相同和边界容量等反例。for _, item : range items { for capacity : limit; capacity item.Weight; capacity-- { dp[capacity] max(dp[capacity], dp[capacity-item.Weight]item.Value) } }算法服务还应设置输入大小和运行时间预算但预算是资源保护不是正确性证明。可以把反例直接写成测试图A - B - A必须返回环错误只有一个重量为 1、价值为 10 的物品、容量为 2 时0-1 背包的结果仍应为 10而不是 20。这样的用例能同时检查拓扑排序的失败路径和 DP 的迭代方向。