
【ybt】【基算 递推 课过 例5】平铺方案
发布日期:2021-05-06 16:01:26
浏览次数:20
分类:原创文章
本文共 835 字,大约阅读时间需要 2 分钟。
平铺方案
题目链接:
题目描述
解题思路
首先,设 f ( i ) f(i) f(i) 表示 i i i 格的平铺方案。
它有两种地砖,那意味着它可以放两格的砖或一格的砖来得到贡献。
而两个占一格的砖可以合成为一格两格的砖,则 f ( i − 2 ) f(i-2) f(i−2) 有三种情况可以贡献到 f ( i ) f(i) f(i)。
再考虑竖着放一个一格的砖的情况,则贡献来自 f ( i − 1 ) f(i-1) f(i−1)。
但是,这样是不行的。我们发现在我们竖着放一格砖的时候,假如当前情况的前一个砖也是竖着的一格砖,那么就和两个一格砖合成一个两格砖的情况重复了。所以我们将两竖砖合成一两格砖的情况归入竖着放一格砖的情况。
则递推式为:
f ( i ) = 2 ∗ f ( i − 2 ) + f ( i − 1 ) f(i)=2*f(i-2)+f(i-1) f(i)=2∗f(i−2)+f(i−1)
记得要用高精度。
code
#include<iostream>#include<cstdio>using namespace std;int n;int f[300][100];int h[300];void e(){ f[1][1]=1,f[2][1]=3; h[1]=1,h[2]=1; for(int i=3;i<=260;i++) { int t=0; for(int j=1;j<=h[i-1]+1;j++) { t=f[i-2][j]*2+f[i-1][j]+t; f[i][j]=t%10; t/=10; } h[i]=h[i-1]; if(f[i][h[i-1]+1]>0) h[i]++; }}int main(){ e(); while(cin>>n) { for(int i=h[n];i>=1;i--) cout<<f[n][i]; cout<<endl; }}
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月11日 14时08分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
惊喜万分!全靠这份999页Java面试宝典,我刚拿到美团offer
2019-03-04
蘑菇街被裁,奋战7个月拿下字节跳动offer
2019-03-04
三面阿里Java岗被挂,竟获内推名额,历经5面拿下口碑offer
2019-03-04
整合:2021年已收录GitHub的最新、最全、最实用的Java岗面试真题
2019-03-04
限时开源!公布半小时下载量达10W:阿里大牛出品「MyCat笔记」
2019-03-04
阿里Java全线成长宝典,从P5到P8一应俱全
2019-03-04
Java程序员面试涨薪手册,字节21火山版强势来袭
2019-03-04
世界级安全专家整理出的Linux高级笔记,限时开源
2019-03-04
GitHub访问破百万,阿里神作:并发实现原理JDK源码笔记
2019-03-04
阿里SpringBoot全栈小册!Github标星百万,限时开源
2019-03-04
js:虚拟dom与diff算法
2019-03-04
计算机系统原理——cachelab 实验1(第一周)
2019-03-04
github学习
2019-03-04
PowerMock框架学习
2019-03-04
JAVA初窥-DAY07
2019-03-04
SpringMVC框架学习(十三)——全局异常处理
2019-03-04
JAVA初窥-DAY13
2019-03-04
Spring Boot (五)——配置自己的banner
2019-03-04
数组--Go语言学习笔记
2019-03-04
Spring Boot (二十一)——自定义异常处理
2019-03-04