zoukankan      html  css  js  c++  java
  • 题解 P1999【覆盖墙壁】

    数学题

    (A_n)(2 imes n) 的墙壁放满块的方案数,考虑递推。
    显然 (A_0=1),我们令对于 (k<0)(A_k=0) .

    放直线型的块非常好递推:

    此时答案即为 (A_{n-1}+A_{n-2}) .

    接下来考虑放 L 型块的:

    显然,两个 L 型块可以并成长方形:

    但是也可以通过摆几个横着的块再合并:

    所以此时答案为 (2(A_{n-3}+A_{n-4}+cdots+A_0)) .

    把两个加起来,得到

    [largeegin{aligned}A_n&=A_{n-1}+A_{n-2}+2left(sum_{i=0}^{n-3}F_i ight)\&=A_{n-1}+A_{n-2}+sum_{i=0}^{n-3}A_i+sum_{i=0}^{n-3}A_i\&=sum_{i=0}^{n-1}A_i+sum_{i=0}^{n-3}A_i&end{aligned} ]

    如果直接暴力转移每次是 (O(n)) 的,总复杂度也就是 (O(n^2)) 的,显然会 tle。

    注意到这是静态区间求和,所以考虑前缀和。令 (S_i=sumlimits_{j=0}^iA_j),递推式变为

    [large A_n=S_{n-1}+S_{n-3} ]

    这个 (S) 可以在转移的时候递推求出来,这样就是 (O(n)) 的了,可以通过。

    注意到这个式子里面很多 (A_i) 被反复加了,分别令 (n=k)(n=k+1),得:

    [largeegin{aligned}A_k&=sum_{i=0}^{k-1}A_i+sum_{i=0}^{k-3}A_i\&=A_{k-1}+A_{k-2}+2A_{k-3}+sum_{i=0}^{k-4}A_iend{aligned} ]

    [largeegin{aligned}A_{k-4}&=sum_{i=0}^{k-2}A_i+sum_{i=0}^{k-4}A_i\&=A_{k-2}+A_{k-3}+2sum_{i=0}^{k-4}A_iend{aligned} ]

    减一下,得到 (A_k-A_{k-1}=A_{k-1}+A_{k-3}),即 (A_k=2A_{k-1}+A_{k-3}) .

    用这个式子递推即可。

  • 相关阅读:
    随机生成三十个二年级的加减乘除法的题目代码
    学习进度表_四周
    返回一个整数数组中最大子数组的和1
    学习进度表_三周
    四则运算4
    构建之法读书笔记2
    学习进度表_二周
    四则运算3
    四则运算2
    单元测试
  • 原文地址:https://www.cnblogs.com/CDOI-24374/p/13776708.html
Copyright © 2011-2022 走看看