
YbtOJ 递推算法课堂过关 例5 平铺方案【递推(简单DP)】
发布日期:2021-05-07 13:09:39
浏览次数:8
分类:原创文章
本文共 1078 字,大约阅读时间需要 3 分钟。
思路
首先读题可得设 f [ i ] f[i] f[i] 表示 2 ∗ i 2*i 2∗i 时的方案数。
因为边最长是2,所以考虑从 f [ i − 1 ] f[i-1] f[i−1] 和 f [ i − 2 ] f[i-2] f[i−2] 转移。
i − 2 i-2 i−2 时的情况:
i − 1 i-1 i−1 时只有可能有一条竖着的,所以直接继承 f [ i − 1 ] f[i-1] f[i−1]。
当然此时存在了重复, i − 2 i-2 i−2 的两条竖着的情况和 i − 1 i-1 i−1 的情况发生了冲突,
所以直接把 i − 2 i-2 i−2 的情况剔除即可。
需要高精度。
C o d e Code Code
#include<iostream>#include<cstdio>#include<cmath>using namespace std;long long f[300][101];int n,m;void gjc(int x){ int jw=0; for(int i=1; i<=f[x-2][0]+1; i++) { f[x][i]=(f[x-2][i]*2)%10+jw; jw=(f[x-2][i]*2)/10; } if(f[x][f[x-2][0]+1]!=0) f[x][0]=f[x-2][0]+1; else f[x][0]=f[x-2][0];}void gjj(int x){ int jw=0; for(int i=1; i<=f[x][0]+1; i++) { int g=(f[x][i]+f[x-1][i]+jw); f[x][i]=g%10; jw=g/10; } if(f[x][f[x][0]+1]!=0) f[x][0]=f[x-1][0]+1;}int main(){ f[1][1]=1,f[2][1]=3,f[1][0]=1,f[2][0]=1; for(int i=3; i<=250; i++) { gjc(i); gjj(i); } //f[i]=f[i-2]*2+f[i-1]; while(cin>>n) { int i=f[n][0]; while(f[n][i]==0) i--; for(int i=f[n][0]; i>=1; i--) cout<<f[n][i]; cout<<endl; } return 0;}
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月05日 07时35分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vim之vim滚屏与跳转
2019-03-04
C指针之函数指针与typedef
2019-03-04
CentOS8 字体大小调整
2019-03-04
设计模式之组合模式
2019-03-04
设计模式之外观模式
2019-03-04
Linux 验证、数字证书、RPM包中文件的提取
2019-03-04
《Redis开发与运维》阅读笔记:键管理之单个键管理
2019-03-04
(CMake):指定标准进行编译、CMake官方文档查看
2019-03-04
(恋上数据结构笔记):优先级队列(Priority Queue)
2019-03-04
(Python学习笔记):条件语句
2019-03-04
(Python学习笔记):字典
2019-03-04
(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念
2019-03-04
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
2019-03-04
(C++11/14/17学习笔记):创建多个线程、数据共享问题分析及案例
2019-03-04
(QT学习笔记):按钮组中的常用控件
2019-03-04
(音视频学习笔记):SDL-YUV显示-播放音频PCM
2019-03-04
leetcode 14 最长公共前缀
2019-03-04
做做Java
2019-03-04
攻防世界新手区pwn
2019-03-04
2020-2021新技术讲座课程
2019-03-04