洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接: https://www.luogu.org/problem/P1310 本题涉及算法:栈、前缀表达式转后缀表达式,动态规划思想。 这道题目我思考了好长时间,第一时间让我做的话我也做不出来。 看洛谷上面的题解给了我很大的启发。 其中最重要的两点启发是: 启发1:中缀加操作数预处理 将原始表达式中添加上‘.’,这些‘.’对应运算数(这么预处理能方便我接下来更方便地将前缀转后缀表达式进行处理); 启发2:动归思想 首先一个状态对应两个值,我暂且将它们设为 \(v0\) 和 \(v1\) ,其中: \(v0\) 表示该状态下结果为 \(0\) 的方案数; \(v1\) 表示该状态下结果为 \(1\) 的方案数。 那么,在前缀转中缀的时候,只有我们假设由两个状态 \(a\) 和 \(b\) 变换到新的状态 \(c\) ,那么: 如果进行的是 + 操作,则 \(c.v0 = a.v0 \times b.v0\) , \(c.v1 = a.v0 \times b.v1 + a.v1 \times b.v0 + a.v1 \times b.v1\) ; 如果进行的是 * 操作,则 \(c.v0 = a.v0 \times b.v0 + a.v0 \times b.v1 + a.v1 \times b.v0\) , \(c.v1 = a.v1 \times b.v1\) 。