P1990-覆盖墙壁

分情况:
\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(1)=1\\
F(2)=2\\\
\\
G(1)=0\\
G(2)=1\\
G(3)=1\\
G(4)=3\\
\]
变式
&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)\) 得
&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]\)

分情况:
\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(1)=1\\
F(2)=2\\\
\\
G(1)=0\\
G(2)=1\\
G(3)=1\\
G(4)=3\\
\]
变式
&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)\) 得
&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-覆盖墙壁的更多相关文章
- 洛谷 P1990 覆盖墙壁
P1990 覆盖墙壁 题目描述 你有一个长为N宽为2的墙壁,给你两种砖头:一个长2宽1,另一个是L型覆盖3个单元的砖头.如下图: 0 0 0 00 砖头可以旋转,两种砖头可以无限制提供.你的任务是计算 ...
- 题解 洛谷P1990 覆盖墙壁
DP康复训练题 原题:洛谷P1990 核心:递推/DP 题源应该是铺地砖,所以采用一摸一样的思路,只是有两种不同的方块 我们先用最最简单的方式尝试一下枚举当最后一行被填满的情况: 1.如果我们只用第一 ...
- 题解 P1999【覆盖墙壁】
数学题 令 \(A_n\) 为 \(2\times n\) 的墙壁放满块的方案数,考虑递推. 显然 \(A_0=1\),我们令对于 \(k<0\),\(A_k=0\) . 放直线型的块非常好递推 ...
- Computer Vision_33_SIFT:PCA-SIFT A More Distinctive Representation for Local Image Descriptors——2004
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- Oracle数据库验证IMP导入元数据是否会覆盖历史表数据
场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...
- java继承覆盖与向上转型,权限
子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...
- 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题
精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法
筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...
随机推荐
- c语言代码练习5
//输入密码,正确就登录,错误重新输入,只能输入三次#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <st ...
- Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器
文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...
- go语言 包依赖管理-构建完整的依赖项目:目录结构及包的调用
目录结构: <home>/ |-- greetings/ |-- hello/1.分别进入对应目录创建以上目录结构 //bash切换到用户主目录 cd $HOMEPAHT$ //bash新 ...
- 如何用ppt打印9张一面,并且去除边距?
如何用ppt打印9张一面,并且去除边距? 方法其实很简单,答主不要在ppt软件的打印选项里设置[每页打印9张幻灯片],而是使用默认的[每页打印1张幻灯片]. 然后去[打印机属性]里设置,我是 ...
- IntersectionObserver v2版本
业务需要内容展示后日志打点,于是使用到了IntersectionObserver,实践中发现一个问题:如果内容出现在了可视区内,但是被其他元素遮挡住了,这时候仍然会打日志. 于是寻找解决方案,发现In ...
- LibOciLib使用说明(2017-1-26更新)
LibOciLib使用说明 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的! ...
- SSL证书链及使用
什么是证书链 证书链简单来说是域名钥证书.CA公钥.根证书形成的一个颁发链条,属于公钥的一部分. 更白话一点,就是证书链文件包含一系列CA机构公钥的证书. 证书链格式 一般证书链格式是.chain,证 ...
- 【发布】DDD 工程脚手架 + 一键安装分布式技术栈环境!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 写了那么多案例工程,开发了那么多技术项目.那小傅哥做的这些案例 ...
- TortoiseGit 使用 OpenSSH Key
中文互联网上没一个说这个东西的,还得是 stackoverflow,原文在这. 方法很简单,修改 TortoiseGit 默认 SSH Client: 修改为 Windows 系统默认 OpenSSH ...
- Ubuntu 20.04 查看内存信息
输入命令 dmidecode -t memory 输出如下: # dmidecode 3.2 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. H ...