2018.01.21【GDKOI2018】模拟B组

T1:首先因为选出来的路径一定是竖着的,所以考虑把每一个叶子节点到根节点的路径放入一个队列里,然后用O(队列长度)的效率求出答案。但是这样会出现重复情况。这时我们可以考虑不统计重复情况。


显然如果我们统计了x到root的答案,那么在统计y到root的答案市会出现重复。那么我们在统计y到root的答案时就多一个限制:路径的两个端点中下面的那个端点一定要在d下面。不难发现,d就是x、y的父亲。于是我们便可以这样处理,对于每一个节点,在统计它的子树时,只能让它第一个儿子的下端点等于它或在它上面,它的其他儿子的下端点都要在它下面。这样便排除了重复情况。


T2:题解待更新。


T3:见OJ上我写的题解。


T4:设f[i][j][l]表示A串到i位置,B串匹配到j位置,目前已截取了l段。

则f[i][j][l]=f[i-1][j][l]+sum(f[r-1][j-(i-r+1)][l-1])(A的r~i与B的j-(i-r+1)+1~j相同)

以上对应的是i选和不选的情况。

但这样会超时。于是我们来观察一下:

f[i][j][l]=f[i-1][j][l]+sum(f[r-1][j-(i-r+1)][l-1])

f[i-1][j-1][l]=f[i-2][j-1][l]+sum(f[r-1][j-1-(i-1-r+1)][l-1])

后面几乎是相同的。也就是说,当a[j]=b[j]时,要求f[i][j][l]的话根本不用枚举r,可以从f[i-1][j-1][l]来推。所以便有了以下公式:

f[i][j][l]=1、f[i-1][j][l](a[i]!=b[j])

            2、f[i-1][j][l]+f[i-1][j-1][l]-f[i-2][j-1][l]+f[i-1][j-1][l-1](a[i]=b[j])

最后注意滚动和模。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值