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 ...
随机推荐
- .NET周刊【9月第3期 2023-09-17】
国内文章 在.NET 8 RC1 版本中 MAUI.ASP.NET Core 和 EF8 的新特性 https://www.cnblogs.com/shanyou/p/17698428.html 从年 ...
- 算法1:寻找完数(JS)
任务一:寻找完数 打印10000以内的完数 完数:与自己所有因子之和相等的数. 1 let sum = 0, i, j; // 定义变量sum.i和j 2 3 for (i = 1; i < 1 ...
- Python开发之Django框架
一. Django框架 01.网络软件开发架构演变过程 02.HTTP协议讲解 03.web应用与框架介绍及手撸web框架 04.Django入门项目创建与必会三板斧 05.Django静态文件配置与 ...
- 单元测验4:人格知识大比武2mooc
单元测验4:人格知识大比武2 返回 本次得分为:10.00/10.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 关于M ...
- 一款简单漂亮的WPF UI - AduSkin
前言 经常会有同学会问,有没有好看简单的WPF UI库推荐的.今天就给大家推荐一款简单漂亮的WPF UI,融合多个开源框架组件:AduSkin. WPF是什么? WPF 是一个强大的桌面应用程序框架, ...
- 1.NoSQL-lesson14-MongoDB核心技术-运维篇
逻辑结构 Mongodb 逻辑结构 MySQL逻辑结构 库database 库 集合(collection) 表 文档(document) 数据行 选择之所以称为为选择,肯定是痛苦的! ------& ...
- JS动态在父元素里追加元素——insertAdjacentHTML
insertAdjacentHTML() 方法将指定的文本解析为 Element 元素,并将结果节点插入到 DOM 树中的指定位置.它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素.这避 ...
- svn的常规使用
svn的常规使用 svn的常规使用 1 客户端 2 svn server 3 qt使用svn 4 svn项目迁移 Ubuntu上使用svn 1 安装 2 使用 svn的常规使用 1 客户端 下载地址: ...
- node版本依赖报错那些事儿
前言 昨天还能跑的的项目,今天就歇菜了 第一步 删除大法 依赖问题,那就把.lock/ node_modules 删除重新装 第二步 如果重装不好使,那就各种降低版本尝试 遇到这样的 有两种方式 1. ...
- [Python急救站课程]斐波那契数列的计算吧
斐波那契数列的计算 a, b = 0, 1 while a < 1000: # 输出不大于1000 的序列.while表示循环 print(a, end=',') a, b = b, a + b