题解 洛谷P1990 覆盖墙壁
DP康复训练题
原题:洛谷P1990
核心:递推/DP
题源应该是铺地砖,所以采用一摸一样的思路,只是有两种不同的方块
我们先用最最简单的方式尝试一下枚举当最后一行被填满的情况:
1.如果我们只用第一种长方形的方块让最后一行填满,那就只有两种情况:
A.最后一列刚好是一个竖着的砖头: B.最后两列都是横着的砖头:
那这个时候我们先定义一个数组F,F的意思取fill,F[i]表示刚好把第i列填满时有多少种方法。
这样的话,因为我们现在只用了第一种方块,所以只可以得出一部分递推公式:F[x]=F[x-1]+F[x-2]+······。这个省略号里的内容就应该是考虑第二种方块时候产生的总数。
2.那我们接着来考虑第二种方块填满最后一行时的情况:
表面上看有两种:
实际上这两个是一模一样的,他们只不过是取决于第n-1列那多出来的那一半是在哪里。所以,如果要使用第二种,最核心的问题是会出现一列有一半的情况。所以我们试着来表示一下这种只有一半的情况:
再定义一个数组H,H的意思取half,H[i]表示把第i列填上一半有多少种方法。
我们再来想一想怎么样才能让这一行出现一半:一共有四种情况:
A.在一个填满的列后面加上一个第二种方块: B.在一个一半的列的空位上放一个横着的第一种方块:
以及他们上下对称的另外两种情况。对B情况,为什么非要加在空位上呢?那如果加在凸起来的那一块上:
我们最后需要的是每一列都被填满的情况,所以说上面的空位迟早要填,填的话又只能填第一种方块,所以如果在凸起来的那一块加的话是等效于先在③位置上先放一个,再往新形成的空位上再加上一个第一种方块,是属于按照情况B放之后出现的下一列的一种情况。所以说,H数组的真正完整的理解应该是:在第i-1列填满的情况下,让第i列只有一半有多少种方法。
回到正题,接着来推H的递推式:
情况A:取决于第i-1列有多少种填满的方式,而且凸出的那一块是可以在上也可以在下两种方式,所以总的是F[i-1]*2
情况B:取决于第i-1列有多少种填一半的方式,但是当前这一块放的位置实际上取决于i-1列的空位在哪里,所以这种情况下是和上一个半行一一对应的,就是H[i-1]
合起来:H[i]=F[i-1]*2+H[i-1]
那么要怎么样把一个填了一半的在下一列变成一个完整的呢?(也就是从H[i]变到F[i+1])
更简单,往空格那里塞一个第二种方块不就好了:
这个图像好像有一点点眼熟?(x
这样的话,在F[i]的推导式里空缺的一项就出来了:H[i-1]
那么把所有情况总结起来,得出最后的状态转移方程:
F[i]=F[i-1]+F[i-2]+H[i-1]
H[i]=F[i-2]*2+H[i-1]
还差一个初状态,画画图可以发现:
F[1]=1(就竖着放一个),F[2]=2(横着放两个,竖着放两个)
H[1]=0(随便怎么放第二个方块的凸块只能在第二列),H[2]=2(凸口在上\在下)
好了,结束。
AC代码:(就懒得打注释了)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int F[10000010]={0},H[1000010]={0};
int n;
int _r(){
int x=0;
char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x;
}
void DP(){
F[1]=1;
F[2]=2;
H[2]=2;
for(int i=3;i<=n;i++){
F[i]=F[i-1]+F[i-2]+H[i-1];
H[i]=2*F[i-2]+H[i-1];
F[i]%=10000;
H[i]%=10000;
}
}
int main(){
n=_r();
DP();
printf("%d",F[n]);
return 0;
}
题解 洛谷P1990 覆盖墙壁的更多相关文章
- 洛谷 P1990 覆盖墙壁
P1990 覆盖墙壁 题目描述 你有一个长为N宽为2的墙壁,给你两种砖头:一个长2宽1,另一个是L型覆盖3个单元的砖头.如下图: 0 0 0 00 砖头可以旋转,两种砖头可以无限制提供.你的任务是计算 ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
随机推荐
- python之字符串方法upper/lower
1.描述: upper():用于将字符串全部转换为大写字母 lower():用于将字符串全部转换为小写字母 2.语法 str.upper() str.lower() 3.返回值 upper()或low ...
- LINUX - 最简单的CS通信实例
服务端[编译:gcc server.c -o server] #include <stdio.h> #include <sys/socket.h> #include <s ...
- 查找命令中grep,find,which和whereis的使用及区别
在linux系统中,许多时候需要查找某些文件或者字符,如果用ls, cd 等基础命令就显得很无力了,那么Linux提供了grep,find,which 三种查找命令,在这里我记录一下: 一.grep命 ...
- Lenet车牌号字符识别+保存模型
# 部分函数请参考前一篇或后一篇文章 import tensorflow as tf import tfrecords2array import numpy as np import matplotl ...
- Web 前端 UI 组件库文档自动化方案 All In One
Web 前端 UI 组件库文档自动化方案 All In One 需求 自动化 动态 好用 markdown element-ui 中示例和说明按照一定规则写在md文件中,调用md-loader将md文 ...
- HTTP vs HTTP/2 vs HTTP/3 (QUIC)
HTTP vs HTTP/2 vs HTTP/3 (QUIC) Nginx HTTP/1.1 HTTP/2 HTTP/3 (QUIC) HTTPS 计算机网络协议 OSI 协议簇 (7) TCP/IP ...
- js 上传图片,用户自定义截取图片大小
js 上传图片,用户自定义截取图片大小 js 组件
- Flutte 什么是Widget,RenderObjects和Elements
原文 Opacity API文档 有没有想过Flutter如何获取这些小部件并将其实际转换为屏幕上的像素? 您可能已经知道如何使用StatelessWidget和StatefulWidget.但是那些 ...
- 【commons-pool2源码】写前思考
写作的初衷 工作4年多, 一直没有系统的阅读过优秀的开源代码, 所以从今年开始做一些尝试, 阅读源码并且试着将自己的理解以文章的形式输出, 从而达到以下目的: 通过阅读源码提升自身的技术水准, 通过写 ...
- 推荐一款好用的免费远程控制软件——ToDesk
创作立场声明:我在本文中评测的软件为自用,感觉不错并且全免费,第一时间发出来和大家分享,欢迎理性观点交流碰撞. 疫情刚开始的时候,待在家里不能上班,但是还是有很多工作需要在线完成,常常需要跑回办公室拿 ...