统计蚂蚁 题解

统计蚂蚁

解题方法

f i , j f_{i,j} fi,j表示前 i i i种类型的蚂蚁用了 j j j个的方案数。

f i , j = ∑ k = 0 n i f i − 1 , j − k \begin{aligned}f_{i,j}=\sum_{k=0}^{n_i}{f_{i-1,j-k}}\end{aligned} fi,j=k=0nifi1,jk
但是由于 j j j可能小于 n i n_i ni,所以 f i , j = ∑ k = 0 m i n ( n i , j ) f i − 1 , j − k \begin{aligned}f_{i,j}=\sum_{k=0}^{min(n_i,j)}{f_{i-1,j-k}}\end{aligned} fi,j=k=0min(ni,j)fi1,jk
我们发现这种算法是 O ( T × ∑ i = 1 A n i ) \begin{aligned}O(T\times{\sum_{i=1}^{A}{n_i}})\end{aligned} O(T×i=1Ani)
数据很水,可以过掉。
最优方法是进行前缀和优化。
s i , j s_{i,j} si,j表示前 i i i种类型的蚂蚁用了 0 − j 0-j 0j个的方案数之和。
也就是 s i , j = ∑ k = 0 j f i , k \begin{aligned}s_{i,j}=\sum_{k=0}^{j}{f_{i,k}}\end{aligned} si,j=k=0jfi,k
运用前缀和优化可得 s i , j = s i , j − 1 + f i , j s_{i,j}=s_{i,j-1}+f_{i,j} si,j=si,j1+fi,j
根据上面这条式子: f i , j = ∑ k = 0 m i n ( n i , j ) f i − 1 , j − k \begin{aligned}f_{i,j}=\sum_{k=0}^{min(n_i,j)}{f_{i-1,j-k}}\end{aligned} fi,j=k=0min(ni,j)fi1,jk
因为是求从 j − m i n ( n i , j ) j-min(n_i,j) jmin(ni,j) j j j f f f的第 i i i项的和,所以
f i , j = s i − 1 , j − s i − 1 , j − m i n ( n i , j ) − 1 f_{i,j}=s_{i-1,j}-s_{i-1,j-min(n_i,j)-1} fi,j=si1,jsi1,jmin(ni,j)1
由此,我们得出了求 s i , j s_{i,j} si,j f i , j f_{i,j} fi,j的公式,可以解决此问题。
时间复杂度降为 O ( A T ) O(AT) O(AT)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值