博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU2044 一只小蜜蜂...
阅读量:7104 次
发布时间:2019-06-28

本文共 925 字,大约阅读时间需要 3 分钟。

问题链接:。基础训练题,用C语言编写程序。

问题简述:参见上述链接。

问题分析这个问题非常类似于,略微有些不同。

站在第n个蜂房想一下,前一步是从哪里来的,问题就清楚了。

看图可知,由于蜜蜂每次只能从前1个蜂房前2个蜂房过来,那么f(n)=f(n-2)+f(n-1)。这部就是一个菲波拉契数列吗?就是一个递推问题?

可是,开始时候,蜜蜂是在第1个蜂房,所以数列的开始几项会有所不同。

f(1)=0,因为蜜蜂开始在第1个蜂房;

f(2)=1,蜜蜂只能从第1个蜂房来到第2个蜂房

f(3)=2,蜜蜂可以从第1个蜂房过来,也可以第2个蜂房过来

f(n)=f(n-2)+f(n-1),n>3。

有了以上的递推式,一切几乎就解决了。

还需要考虑的一点是,蜜蜂从a蜂房到b蜂房的各种可能路径,相当于从第1蜂房到第b-a+1蜂房。

另外一点是,还是先打表吧,以防万一。

程序说明:(略)。

AC的C语言程序如下:

/* HDU2044 一只小蜜蜂... */#include 
#define MAXN 50typedef unsigned long long ULL;ULL fn[MAXN+1];void setfn(){ int i; fn[0] = 0; fn[1] = 0; fn[2] = 1; fn[3] = 2; for(i=4; i<=MAXN; i++) fn[i] = fn[i-2] + fn[i-1];}int main(void){ int n, a, b; // 先打表(以防万一测试集合大) setfn(); scanf("%d", &n); while(n--) { // 读入a和b scanf("%d%d", &a, &b); // 输出结果 printf("%lld\n", fn[b - a + 1]); } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7564646.html

你可能感兴趣的文章
http://blog.csdn.net/LANGXINLEN/article/details/50421988
查看>>
PHP高效率写法(详解原因)
查看>>
Swift 值类型/引用类型
查看>>
【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置
查看>>
[每天五分钟,备战架构师-9]数据库系统
查看>>
[转]WinForm和WebForm下读取app.config web.config 中邮件配置的方法
查看>>
HDU-1903 Exchange Rates
查看>>
ado.net entity framework使用odp.net(ODAC for .net)连接oracle11g体验
查看>>
svn怎么版本还原?
查看>>
ABP源码分析三十七:ABP.Web.Api Script Proxy API
查看>>
Quartz 定时任务管理
查看>>
大公司都有哪些开源项目~~~简化版
查看>>
java生成word的完美解决方案
查看>>
ubuntu使用记录
查看>>
java生成zip压缩文件,解压缩文件
查看>>
我的Ajax服务端框架 - 安全问题,初始化设置,实现原理
查看>>
一位程序员的十个忠告
查看>>
[转]代理(Proxy)和委派(Delegate)的区别
查看>>
【JAVASCRIPT】js知识点整理1
查看>>
两天入门五天掌握,这样的laravel别告诉我难
查看>>