分情况:

\[\left\{
\begin{aligned}
& 条形 \left\{ \begin{aligned}
横着\\
竖着\\
\end{aligned}\right. \\
& L形\\
\end{aligned}
\right.
\]

条形

设 $ F(n)$ 长度为 \(n\) 的方法数

横着

\(F(n)+=F(n-1)\)

竖着

\(F(n)+=F(n-2)\)

L形

设\(G(n)\) 为长度凸出来那一点到 \(n\) 的方法数

\(G(n)=G(n-1)+F(n-2)\)

此为\(G\) 的递推公式

答案

\(F(n)=F(n-1)+F(n-2)+2\times G(n-1)\)

此为\(F\) 的递推公式

初始条件

\[F(0)=1\\
F(1)=1\\
F(2)=2\\\
\\
G(1)=0\\
G(2)=1\\
G(3)=1\\
G(4)=3\\
\]

变式

\[\begin{aligned}
&G(n)-G(n-1)=F(n-2)\\
&G(n-1)-G(n-2)=F(n-3)\\
&\cdots\\
&G(4)-G(3)=F(2)\\
&G(3)-G(2)=F(1)\\
&G(2)-G(1)=F(0)\\
&累加得\\
&G(n)=\sum_{k=0}^{n-2} F(k)+G(1)\\
&G(2)=1\\
&G(n)=\sum_{k=0}^{n-2} F(k)\\
\end{aligned}
\]

所以\(F(n)\) 得

\[\begin{aligned}
&F(n)=F(n-1)+F(n-2)+2\times G(n-1)\\
&带入G(n-1)\\
&得到F(n)=F(i-1)+F(i-2)+2\times\sum_{i=0}^{n-3} F(i)\\

\end{aligned}
\]

#include<iostream>
using namespace std;
const int N = 1e7+9;
int F[N];
int main() {
int n; cin >> n;
int ch = 0;
F[0] = 1; F[1] = 1; F[2] = 2;
for (int i = 3; i <= n; i++) {
ch += F[i - 3];
ch %= 10000;
F[i] = F[i - 1] + F[i - 2] + 2 * ch;
F[i] %= 10000;
}
cout << F[n];
return 0;
}

或者改为

#include<iostream>
using namespace std;
const int N = 1e7 + 9;
int F[N];
int main() {
int n; cin >> n;
int ch = 0;
F[3] = 1;\\表示n=0的时候
for (int i = 4; i <= n+3; i++) {
ch += F[i - 3];
ch %= 10000;
F[i] = F[i - 1] + F[i - 2] + 2 * ch;
F[i] %= 10000;
}
cout << F[n+3];
return 0;
}

由于只用到了\(F(i)\) \(F(i-1)\) \(F(i-2)\) \(F(3)\)

简化为

#include<iostream>
using namespace std;
int main() {
int n; cin >> n;
int ch = 0;
int a = 0, b = 0, c = 1,ans=0;
for (int i = 1; i <= n; i++) {
ch += a;
ch %= 10000;
ans = b + c + 2 * ch;
ans %= 10000;
a = b;
b = c;
c = ans;
}
cout << ans;
return 0;
}

\(a\) 表示 \(F[-2]\)

\(b\) 表示 \(F[-1]\)

\(c\) 表示 \(F[0]\)

\(ans\) 表示 \(F[1]\)

分情况:

\[\left\{
\begin{aligned}
& 条形 \left\{ \begin{aligned}
横着\\
竖着\\
\end{aligned}\right. \\
& L形\\
\end{aligned}
\right.
\]

条形

设 $ F(n)$ 长度为 \(n\) 的方法数

横着

\(F(n)+=F(n-1)\)

竖着

\(F(n)+=F(n-2)\)

L形

设\(G(n)\) 为长度凸出来那一点到 \(n\) 的方法数

\(G(n)=G(n-1)+F(n-2)\)

此为\(G\) 的递推公式

答案

\(F(n)=F(n-1)+F(n-2)+2\times G(n-1)\)

此为\(F\) 的递推公式

初始条件

\[F(0)=1\\
F(1)=1\\
F(2)=2\\\
\\
G(1)=0\\
G(2)=1\\
G(3)=1\\
G(4)=3\\
\]

变式

\[\begin{aligned}
&G(n)-G(n-1)=F(n-2)\\
&G(n-1)-G(n-2)=F(n-3)\\
&\cdots\\
&G(4)-G(3)=F(2)\\
&G(3)-G(2)=F(1)\\
&G(2)-G(1)=F(0)\\
&累加得\\
&G(n)=\sum_{k=0}^{n-2} F(k)+G(1)\\
&G(2)=1\\
&G(n)=\sum_{k=0}^{n-2} F(k)\\
\end{aligned}
\]

所以\(F(n)\) 得

\[\begin{aligned}
&F(n)=F(n-1)+F(n-2)+2\times G(n-1)\\
&带入G(n-1)\\
&得到F(n)=F(i-1)+F(i-2)+2\times\sum_{i=0}^{n-3} F(i)\\

\end{aligned}
\]

#include<iostream>
using namespace std;
const int N = 1e7+9;
int F[N];
int main() {
int n; cin >> n;
int ch = 0;
F[0] = 1; F[1] = 1; F[2] = 2;
for (int i = 3; i <= n; i++) {
ch += F[i - 3];
ch %= 10000;
F[i] = F[i - 1] + F[i - 2] + 2 * ch;
F[i] %= 10000;
}
cout << F[n];
return 0;
}

或者改为

#include<iostream>
using namespace std;
const int N = 1e7 + 9;
int F[N];
int main() {
int n; cin >> n;
int ch = 0;
F[3] = 1;\\表示n=0的时候
for (int i = 4; i <= n+3; i++) {
ch += F[i - 3];
ch %= 10000;
F[i] = F[i - 1] + F[i - 2] + 2 * ch;
F[i] %= 10000;
}
cout << F[n+3];
return 0;
}

由于只用到了\(F(i)\) \(F(i-1)\) \(F(i-2)\) \(F(3)\)

简化为

#include<iostream>
using namespace std;
int main() {
int n; cin >> n;
int ch = 0;
int a = 0, b = 0, c = 1,ans=0;
for (int i = 1; i <= n; i++) {
ch += a;
ch %= 10000;
ans = b + c + 2 * ch;
ans %= 10000;
a = b;
b = c;
c = ans;
}
cout << ans;
return 0;
}

\(a\) 表示 \(F[-2]\)

\(b\) 表示 \(F[-1]\)

\(c\) 表示 \(F[0]\)

\(ans\) 表示 \(F[1]\)

P1990-覆盖墙壁的更多相关文章

  1. 洛谷 P1990 覆盖墙壁

    P1990 覆盖墙壁 题目描述 你有一个长为N宽为2的墙壁,给你两种砖头:一个长2宽1,另一个是L型覆盖3个单元的砖头.如下图: 0 0 0 00 砖头可以旋转,两种砖头可以无限制提供.你的任务是计算 ...

  2. 题解 洛谷P1990 覆盖墙壁

    DP康复训练题 原题:洛谷P1990 核心:递推/DP 题源应该是铺地砖,所以采用一摸一样的思路,只是有两种不同的方块 我们先用最最简单的方式尝试一下枚举当最后一行被填满的情况: 1.如果我们只用第一 ...

  3. 题解 P1999【覆盖墙壁】

    数学题 令 \(A_n\) 为 \(2\times n\) 的墙壁放满块的方案数,考虑递推. 显然 \(A_0=1\),我们令对于 \(k<0\),\(A_k=0\) . 放直线型的块非常好递推 ...

  4. Computer Vision_33_SIFT:PCA-SIFT A More Distinctive Representation for Local Image Descriptors——2004

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  5. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  6. Oracle数据库验证IMP导入元数据是否会覆盖历史表数据

    场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...

  7. java继承覆盖与向上转型,权限

    子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...

  8. 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题

    精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...

  9. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  10. bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法

    筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...

随机推荐

  1. 第一次git上传的完整流程

    第一次git上传的完整流程 使用git简单命令上传代码push到远程仓库 + 简单介绍了一个.git文件结构. 代码上传到gitee和github流程一样的,不过你上传到github可能网不行失败,所 ...

  2. Django-rest-framework框架——过滤排序分页异常处理、自动生成接口文档、JWT认证

    @ 目录 一 过滤Filtering 二 排序 三 分页Pagination 可选分页器 应用 四 异常处理 Exceptions 4.1 使用方式 4.2 案例 4.3 REST framework ...

  3. Python正则表达式——常用re正则表达式集合

    文章目录 一.校验数字的表达式 二.校验字符的表达式 三.特殊需求表达式 一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^ ...

  4. CF1534C

    题目简化和分析: 涉及算法:并查集. 为什么要使用并查集: 因为交换只能是列交换,并且保证不与别的重复 我们通过观察题目发现,某些列之间互为限制关系 即如果某列序列排序方式固定,则被限制的列也为固定的 ...

  5. 【Unity3D】水面特效

    1 前言 ​ 水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节.Shader Graph 基础知识详见→Shader Graph简 ...

  6. 漫谈C#的定时执行程序

    1.写法1 task的lambda表达式 #region 写法1 task的lambda表达式 //static void Main() //{ // // 创建并启动两个任务 // Task tas ...

  7. 自然数的拆分问题(lgP2404)

    dfs.又调了一个小时,窝果然菜 需要传递的变量分别为目前搜索的数字:目前所有选中数字的和:目前所选数字个数. 见注释. #include<bits/stdc++.h> using nam ...

  8. MongoDB 中的锁分析

    MongoDB 中的锁 前言 MongoDB 中锁的类型 锁的让渡释放 常见操作使用的锁类型 如果定位 MongoDB 中锁操作 1.查询运行超过20S 的请求 2.批量删除请求大于 20s 的请求 ...

  9. 一步步带你剖析Java中的Reader类

    本文分享自华为云社区<深入理解Java中的Reader类:一步步剖析>,作者:bug菌. 前言 在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理.J ...

  10. 关于PaddleOCR识别时中文路径导致报错/没输出结果

    此处只做学习PaddleOCR时遇到的一些坑 一.Python版本与PaddleOCR兼容性问题 如果你在Python11的环境下安装PaddlePaddle,使用 paddleocr --image ...