Math String

题意:

给定长度n,求所有只含数字1~9,‘+’,‘*’的合法表达式的值之和

分析:

直接求这个式子的值是比较困难的。考虑到题目给出的n值相当大,猜测这个要么有一个比较简单的公式要么是递推类型的或者是找循环节。因此我们可以考虑使用BM板子去推。需要注意的是使用BM板子正常需要10个数会比较保险,而这题如果只放10个连样例都过不了。这也算这题比较良心的一点。

考虑使用BM板子的话,首先我们考虑每一位放什么都进行枚举,这样求长度n的复杂度大约是11^{n},考虑判断是否合法,还需要再乘一个n,这样的复杂度几乎只能保证放10个进去,正常是没有问题的,可惜这题不正常。考虑优化,我们可以尝试先把数字位填好,然后去枚举两个数字之间的符号,这样复杂度就降到了n * 3^{n}。但是这样写加上BM板子的复杂性,除非比赛时队里有专精大模拟的选手并且时间充裕,否则并不是很建议这样搞一搞。当然直到这里,思维含量都并不是很高。

接下来我们考虑一个比较符合出题者意图的解法。

注意到我们之前的问题在于符号的处理,如果没有符号的话,这题就是一个简单的数位dp,于是我们先将这部分写出来,得到dp[n] = dp[n-1]*9+45*10^{n-1}或者你可能得到dp[n]=dp[n-1]*90+45*9^{n-1}。接下来考虑乘法和加法,对于每一种情况,我们可以考虑枚举最后一个符号出现的位置,当然枚举第一个问题也不大,这里就只考虑最后一个。接着乘法和加法我们先处理乘,后处理加,这是比较自然的想法。考虑乘法,我们可以列出dp2[n] = \sum_{i+j=n-1} dp2[i]*dp[j]。这个式子含义也比较清晰,前半部分是我们已处理有符号的部分,后半部分尚未处理的数,至于为什么这个式子是对的,我们可以从以下方面思考。假设所有长度为i的式子构成集合A,后面同理构成集合B,于是一个长度为n的式子可以由长度i的式子以及长度j的次一级式子构成,即从集合A取一个a,然后从集合B取一个b,a*b即所求。于是所有的和就是sum[{A}]*sum[{B}]。这一部分也没什么理解难度,绕绕还是可以绕明白的。

最后处理加法部分,这里我们采取贡献的方式,即左侧出现次数*右侧权值+右侧出现次数*左侧权值,为什么呢。因为左侧某一个值出现次数就是右侧所有值出现次数。至于方案数,我们按照上述步骤同理可得。

dp3[n]=\sum _{i+j=1}(dp3[i]*F_2[j]+dp2[j]*F_3[i])

不妨记F1,F2,F3,依次为dp,dp2,dp3所对应的方案数

显然有F_1[n]=9^{n}

F_2[n]=\sum_{i+j=n-1}F_2[i]*F_1[j]

F_3[n]=\sum_{i+j=n-1}F_3[i]*F_2[j]

至此,我们得到了一个时间复杂度为n^2的递推,如果你有BM板子的话,这个时候大可以放20项进去看看结果,而不必继续推导。因为卡特兰数就有类似的公式,所以我们完全可以认为这是一个线性递推,当然从结果来看确实没问题。但是如果不是比赛,我们还是继续往下看看。

 

注意到F_1是等比数列,故对于F_2,我们做如下操作

F_2[n+1]-9*F_2[n]=F_2[n-1]*F_1[1]

F_2[n+1]=9*F_2[n]+9*F_2[n-1]

 即$$ F_3[n+2]=9*F_3[n+1]+9*F_3[n]+F_2[1]*F_3[n]+ $$ F_2[2]*F_3[n-1]-9*F_2[1]*F_3[n-2](希望没有推错式子)

dp2,dp3推导同理,下略略略


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值