分情况:

\[\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. 模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案

    免责声明 使用者本人对于传播和利用本公众号提供的信息所造成的任何直接或间接的后果和损失负全部责任.公众号及作者对于这些后果不承担任何责任.如果造成后果,请自行承担责任.谢谢! 大家好,我是沙漠尽头的狼 ...

  2. GPT-4 API waitlist

    Skip to main content Site Navigation GPT-4 API waitlist We're making GPT-4 available as an API for d ...

  3. LVGL双向链表学习笔记

    LVGL双向链表学习笔记 1.LVGL链表数据类型分析 对于LVGL双向链表的使用,我们需要关注lv_ll.h和lv_ll.c两个文件,其中lv_ll.h里面包含了链表结构类型定义,以及相关API的声 ...

  4. 19c上ADG主库sys密码修改会影响备库同步吗?

    一套Oracle 19c的ADG集群要修改sys密码,由于之前遇见过11g上sys密码修改导致同步问题的情况,所以改之前特意查了下文档,发现其实12cR2开始,在主库修改密码就会自动同步到备库了,以下 ...

  5. 云图说|初识API中心APIHub

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:API中心是为AP ...

  6. VS Code C# 开发工具包正式发布

    前言 微软于本月正式发布Visual Studio Code C#开发工具包,此前该开发套件已经以预览版的形式在6月份问世.经过4个月的测试和调整,微软修复了350多个问题,其中大部分是用户反馈导致的 ...

  7. 从零开始的Java编程:教你如何实现“超级马里奥”游戏!

    引言超级马里奥,这个名字对于游戏迷来说一定不陌生.它是一款经典的游戏系列,以一个勇敢的水管工人--马里奥为主角,讲述了他在蘑菇王国中的冒险故事.在这个充满挑战和刺激的游戏中,玩家需要控制马里奥跳跃.躲 ...

  8. 线性dp数字三角形

    数字三角形是最裸的题目,没有加入任何的背景,这里就不写了. 下面这道摘花生的题目就是数字三角形的应用 Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图) ...

  9. java学习内容-1

    java学习内容-1 (一)jdk的使用 (二)定义标识符的规则 (三)java常用类 1.String类 2.Math类 3.Integer和Double类 4.输出 5.Scanner类 例子 ( ...

  10. JUC并发编程学习笔记(六)Callable(简单)

    Callable(简单) callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常. 1.可以有返回值 2.可以抛出异常 3. ...