我正在阅读Steven S Skiena的The Algorithm Design Manual,并试图理解War Story: What’s Past is Prolog问题的解决方案。 问题也很好地描述了here。
基本上,问题是,给定一个有序的字符串列表,给出一个最佳解决方案来构造一个具有最小大小的trie(字符串字符作为节点),其约束条件是必须保留字符串的顺序,而字符索引可以重新排序。
也许这对于stackoverflow来说不是一个合适的问题,我仍然想知道是否有人能给我一些关于解决方案的暗示,特别是这个重现意味着它的论点: the recurrence for the Dynamic Programming algorithm
答案 0 :(得分:0)
你可以这样思考:
我们假设我们修复了第一个字符的索引。根据此位置中字符的值,所有字符串都会分成r
个bin(bin基本上是子树)。
我们可以独立使用每个垃圾箱。它不会改变不同bin中的顺序,因为不同bin中的两个字符串在第一个字符中是不同的。
因此,我们可以独立解决每个垃圾箱的问题。之后,我们只需要一条边将根连接到每个bin(即子树)。这就是公式的地方
C[i_k, j_k] + 1
来自。
由于我们希望最小化边缘总数并且我们可以自由选择第一个位置,我们只需尝试m
个位置中的所有可能选项。
注意:假设我们可以独立地重新排序每个子树中的其余字符,此算法是正确的。如果不是这样,则动态编程解决方案不正确。