题解 P1990【覆盖墙壁】

数学题

An2×n 的墙壁放满块的方案数,考虑递推。
显然 A0=1,我们令对于 k<0Ak=0 .

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

此时答案即为 An1+An2 .

接下来考虑放 L 型块的:

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

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

所以此时答案为 2(An3+An4++A0) .

把两个加起来,得到

An=An1+An2+2(i=0n3Fi)=An1+An2+i=0n3Ai+i=0n3Ai=i=0n1Ai+i=0n3Ai

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

注意到这是静态区间求和,所以考虑前缀和。令 Si=j=0iAj,递推式变为

An=Sn1+Sn3

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

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

Ak=i=0k1Ai+i=0k3Ai=Ak1+Ak2+2Ak3+i=0k4Ai

Ak4=i=0k2Ai+i=0k4Ai=Ak2+Ak3+2i=0k4Ai

减一下,得到 AkAk1=Ak1+Ak3,即 Ak=2Ak1+Ak3 .

用这个式子递推即可。

posted @   yspm  阅读(196)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示