我必须提出一种有效的算法,它采用这种格式的树:
?
/ \
? ?
/ \ / \
G A A A
并使用提供最少量突变的值填充问号节点。值只能是{A,C,T,G}。树将始终具有相同的形状和节点数量。此外,它将始终填充叶节点,其余节点将是需要填充的问号。
例如,右边的树是正确的,并且比左边的树更少。
A A
/ \ / \
G G A A
/ \ / \ / \ / \
G A A A G A A A
父节点与子节点不同时发生突变。因此,上面的左侧树包含五个突变,右上方有一个突变。
有人可以通过提供伪代码来帮助我吗?感谢。
答案 0 :(得分:0)
这看起来像树底部的动态编程。对于每个节点,您希望计算出最低成本解决方案,以便为每种可能性留下标记为A,C,T或G的节点。您可以通过使用先前为该节点下方节点的每种可能性计算的成本来解决此问题。只是计算成本的代码可能有点像这样。
LeastCost(node, colourHere)
{
foreach colour
leastLeft[colour] = LeastCost(leftChild, colour)
leastRight[colour] = LeastCost(rightChild, colour)
best = infinity
foreach combination
cost = leastLeft[combination.leftColour] +
leastRight[combination.rightColour]
if (combination.leftColour != colourHere)
cost++;
if (combination.rightColour != colourHere)
cost++;
if (cost < best)
cost = best;
return cost
}
返回最佳答案以及跟踪与最佳答案相对应的组合所需的最佳成本。考虑一下,您可以通过同时计算每个节点上所有四种颜色的答案来节省时间。