动态规划第四节课
骨牌覆盖
在2×n的一个长方形方格中,用一个1×2的骨牌铺满方格,输入n,输出铺放方案的总数
以下是2×3的网格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxO8gqhH-1623233032892)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163008580.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BH5iWXgB-1623233032894)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163044749.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEeE8LSy-1623233032895)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163130540.png)]
有3种。
以下是2×4的网格
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZEvn96i-1623233032897)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163254100.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jbnMB1q-1623233032899)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163323291.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YinXAscN-1623233032900)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163342894.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvKktrFy-1623233032901)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163403923.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzOt43mW-1623233032903)(C:\Users\17816\AppData\Roaming\Typora\typora-user-images\image-20210609163424031.png)]
有5种。
2×5的就不画了,一共有八种(用这么多,画到×20,废了两台电脑~)
1 2 3 5 8 1\ 2\ 3\ 5\ 8 1 2 3 5 8
这是什么规律?
对,就是我们熟悉的Fib数列!
F i b ( i ) = ( i ≤ 2 ) 1 ( i > 2 ) F i b ( i − 1 ) + F i b ( i − 2 ) Fib(i)=(i\le2) 1\\\quad\quad\quad\quad (i\gt2) Fib(i-1)+Fib(i-2) Fib(i)=(i≤2)1(i>2)Fib(i−1)+Fib(i−2)
今天的这道题藏得比较隐蔽~不容易看出来
快推Fib数列
假设最后一列是竖的放的, F ( i ) = F ( i − 1 ) F(i)=F(i-1) F(i)=F(i−1)
如果最后一列是横着放的, F ( i ) = F ( i − 2 ) F(i)=F(i-2) F(i)=F(i−2)
所以 F ( i ) = F ( i − 1 ) + F ( i − 2 ) F(i)=F(i-1)+F(i-2) F(i)=F(i−1)+F(i−2)
F ( i − 1 ) F(i-1) F(i−1)和 F ( i − 2 ) F(i-2) F(i−2)就是两个子问题!
子问题!
子问题!
子问题!
子问题!
子问题!
代码
#include <iostream>
#include <cstdio>
using namespace std;
long long f[100010];
int main()
{
int n;
scanf("%d", &n);
for(int i = 3; i <= n; i ++)
{
f[i] = f[i - 1] + f[i - 2];
}
printf("%lld\n", f[n]);
return 0;
}