题意:
给定长度n,求所有只含数字1~9,‘+’,‘*’的合法表达式的值之和
分析:
直接求这个式子的值是比较困难的。考虑到题目给出的n值相当大,猜测这个要么有一个比较简单的公式要么是递推类型的或者是找循环节。因此我们可以考虑使用BM板子去推。需要注意的是使用BM板子正常需要10个数会比较保险,而这题如果只放10个连样例都过不了。这也算这题比较良心的一点。
考虑使用BM板子的话,首先我们考虑每一位放什么都进行枚举,这样求长度n的复杂度大约是,考虑判断是否合法,还需要再乘一个n,这样的复杂度几乎只能保证放10个进去,正常是没有问题的,可惜这题不正常。考虑优化,我们可以尝试先把数字位填好,然后去枚举两个数字之间的符号,这样复杂度就降到了。但是这样写加上BM板子的复杂性,除非比赛时队里有专精大模拟的选手并且时间充裕,否则并不是很建议这样搞一搞。当然直到这里,思维含量都并不是很高。
接下来我们考虑一个比较符合出题者意图的解法。
注意到我们之前的问题在于符号的处理,如果没有符号的话,这题就是一个简单的数位dp,于是我们先将这部分写出来,得到或者你可能得到。接下来考虑乘法和加法,对于每一种情况,我们可以考虑枚举最后一个符号出现的位置,当然枚举第一个问题也不大,这里就只考虑最后一个。接着乘法和加法我们先处理乘,后处理加,这是比较自然的想法。考虑乘法,我们可以列出。这个式子含义也比较清晰,前半部分是我们已处理有符号的部分,后半部分尚未处理的数,至于为什么这个式子是对的,我们可以从以下方面思考。假设所有长度为i的式子构成集合A,后面同理构成集合B,于是一个长度为n的式子可以由长度i的式子以及长度j的次一级式子构成,即从集合A取一个a,然后从集合B取一个b,a*b即所求。于是所有的和就是。这一部分也没什么理解难度,绕绕还是可以绕明白的。
最后处理加法部分,这里我们采取贡献的方式,即左侧出现次数*右侧权值+右侧出现次数*左侧权值,为什么呢。因为左侧某一个值出现次数就是右侧所有值出现次数。至于方案数,我们按照上述步骤同理可得。
不妨记F1,F2,F3,依次为dp,dp2,dp3所对应的方案数
显然有
至此,我们得到了一个时间复杂度为的递推,如果你有BM板子的话,这个时候大可以放20项进去看看结果,而不必继续推导。因为卡特兰数就有类似的公式,所以我们完全可以认为这是一个线性递推,当然从结果来看确实没问题。但是如果不是比赛,我们还是继续往下看看。
注意到是等比数列,故对于,我们做如下操作
即
即(希望没有推错式子)
dp2,dp3推导同理,下略略略