首页 > 其他 > 详细

[0001]合法序列

时间:2020-05-09 16:12:30      阅读:54      评论:0      收藏:0      [点我收藏+]

//想强迫自己每天写一篇题解哈哈哈

//解法中不加粗的部分是一些自己思维approach的过程

题目大意:

  给定n,m,求有多少个长度为2*(n+m)的由A B构成的序列,可以拆成n个"AB"子序列和m个"BA"序列。eg. 序列ABAABB,可以将它拆成3个子序列AB(第1个和第6个字符),BA(第2个和第3个字符),AB(第4个和第5个字符)。对1e9+7取模。

  多测。T<=1e5, 1<=n,m<=1e5。

题目解法:

  首先我们需要知道一个序列合法需要满足的条件。

  感性理解的话我们可以想到如果一个前缀有太多的A那么会导致后面有太多的B无法被用来组成“BA”。反之如果有太多的B则会导致"AB"的失配。

  那么我们现在应该找到一个判断前缀合法的式子P 若一个序列的所有前缀均满足P 则合法。那么现在我们就要找到这个P。

  考虑一个前缀,我们用cntA cntB分别代表该前缀中A和B的数量

  1° cntA>cntB 此时BA可能失配

   该情况下我们最多可以组成的BA数量为cntB+(n+m)-cntA。因此若cntA-cntB>n,包含该前缀的序列一定不合法。

  2° cntB>cntA 此时AB可能适配

   该情况下我们最多可以组成的AB数量为cntA+(n+m)-cntB。因此若cntA-cntB<-m,包含该前缀的序列一定不合法。

  因此我们可以得到一个结论:

  合法序列等价于对于任意一个前缀-m<=cntA-cntB<=n

  接着我们可以想到dp状态及转移方程:f(cntA,cntB)=f(cntA-1,cntB)+f(cntA,cntB-1), (-m<=cntA-cntB<=n)


 

  从数据范围猜测组合数乱搞。再结合这个转移方程的特征,将其转化为如下问题:

  从(0,0)走到(n+m,n+m),如下点不能走:

    1. x-y>n

    2. x-y<-m

  技术分享图片

  显然这两种情况不重合,可以从总方案数技术分享图片中减去

  考虑第一种情况,我们需要寻找经过特定右下角的路径条数(显然这个等腰直角三角形的边长为m)

技术分享图片

  通过如上翻折转化我们将本来的问题转化为了从一个(2n+2+m)*m的方格左下角走到右上角的方案数。

  显然这种关系是一一对应的。

  第二种情况同理。

  因此对于任意n,m,有答案技术分享图片

 

[0001]合法序列

原文:https://www.cnblogs.com/myrcella/p/12857986.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!