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}) .

    用这个式子递推即可。

  • 相关阅读:
    【小米OJ-找多少个等差数列】动态规划
    【小米OJ-找出可能的合的组合】深搜(dfs)
    【小米OJ-移除k位得到最小值】栈的应用
    【小米OJ-小米兔的轨迹】顺时针蛇形矩形
    Qt常用类
    file_operations
    Proc文件系统
    memset
    Source Insight快捷键大全
    内核内存分配
  • 原文地址:https://www.cnblogs.com/CDOI-24374/p/13776708.html
Copyright © 2011-2022 走看看