【容斥原理】wikioi 1778 统计公共子序列个数

本文介绍了如何运用容斥原理解决一道OI题目,涉及到统计多个序列的不重复公共子序列数量。分析了单序列时的转移方程,并扩展到多序列情况,提出了处理多序列状态转移的思路,最终给出了利用容斥原理的状态转移方程,并提醒注意高精度计算的处理。
摘要由CSDN通过智能技术生成

题目链接:http://wikioi.com/problem/1778/

分析:

我们先思考,当只有一个序列时,如何求出其有多少个不重复的子序列?显然可以定义F[I]表示这个序列的前I位有多少个不同的子序列,转移方程很简单,因为第I个字母可以接在某序列的后面,也可以不接,自然就是F[I]=F[I-1]*2。这样我们会发现答案就是2^长度。但是,这显然是错的。因为我们没有判重!

要知道如何去重,就必须知道出现重复序列的原因!

设当前位S[I]=’a’,并且存在一个最大的J,使得J<I且S[J]=‘a’,那么当阶段在J的时候,我们可以选择是够让F[J-1]个序列接上S[J]。同理,阶段在I的时候,可以选择是否让F[I-1]个序列接上S[I]。显然,F[I-1]包含了所有F[J

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值