《Logic Expression Tree》题目分析
本题是一道树形DP的题目。
我们不妨用v[x]表示以节点x为根的子树的值,f[x]表示为了翻转翻转v[x],需要至少改变多少个运算符。显然f[1]就是最后的答案。
而影响v[x]值的因素只有3个:
1) x节点的运算符。改变x节点的运算符会使f[x]增加1。
2) x左子树的值,v[x.leftchild]。改变v[x.leftchild]会使f[x]增加f[x.leftchild]。
3) x右子树的值,v[x.righthild]。改变v[x.rightchild]会使f[x]增加f[x.rightchild]。
以上3种因素都可能改变/不改变二选一,所以一共有8种组合。我们只需枚举这8中组合,找到哪些组合会使v[x]改变,并从中找到f[x]最小的组合即可。
于是我们得到了一个递归或者说自底向上DP的算法。时间复杂度是O(N)的。
谢谢!