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 覆盖墙壁的更多相关文章

  1. 洛谷 P1990 覆盖墙壁

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

  2. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  3. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  4. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  5. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  6. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  7. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  8. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  9. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

随机推荐

  1. K8S(05)核心插件-ingress(服务暴露)控制器-traefik

    K8S核心插件-ingress(服务暴露)控制器-traefik 1 K8S两种服务暴露方法 前面通过coredns在k8s集群内部做了serviceNAME和serviceIP之间的自动映射,使得不 ...

  2. 字节笔试题 leetcode 69. x 的平方根

    更多精彩文章请关注公众号:TanLiuYi00 题目 解题思路 题目要求非负整数 x 的平方根,相当于求函数 y = √x 中 y 的值. 函数 y = √x  图像如下: 从上图中,可以看出函数是单 ...

  3. 关于rand()

    虽然很早就知道rand是伪随机了,但是一般都懒得用srand. 直到模拟银行家算法时不用srand就造成数据实在有点假(-_-||) 所以要记得srand((int)time(0))啊

  4. Ubuntu pppoeconf失败

    之前是通过sudo pppoeconf一路yes就可以连通有线网络(dsl和ethernet)的, 系统再次瘫痪后终于进入图形界面, 有线网络丢失, sudo pppoeconf也fail了, 其实加 ...

  5. TypeScript 4.x Tutorials

    TypeScript 4.x Tutorials TypeScript 4.x 最新教程 https://typescript-4x-tutorials.xgqfrms.xyz/ https://gi ...

  6. Open Collective

    Open Collective Open Collective is an online funding platform for open and transparent communities. ...

  7. js Array All In One

    js Array All In One array 方法,改变原数组(长度),不改变原数组(长度) https://developer.mozilla.org/en-US/docs/Web/JavaS ...

  8. Python Web Frameworks

    Python Web Frameworks top 10 Python web frameworks Django (Full-stack framework) Flask (Micro framew ...

  9. uniapp 在h5和小程序上使用高德获取用户城市位置

    开发文档 https://lbs.amap.com/api 错误状态 https://lbs.amap.com/api/webservice/guide/tools/info/ 虽然用的高德但是你还需 ...

  10. 什么是NGK节点?NGK的节点有什么作用?

    从2018年EOS竞选超级节点火爆整个区块链圈,节点和超级节点就成为了热议的话题,时至今日,热度依然不减.节点是项目生态发展的重要组成部分,超级节点对项目的运行.安全更是起着至关重要的作用.   什么 ...