博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2016级算法第一次练习赛-A.群鸦的盛宴
阅读量:4559 次
发布时间:2019-06-08

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

858 群鸦的盛宴

题目链接:

思路

本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线数。

你很厉害,这是DP的思想。可是什么情况才用DP:分解得到子问题往往不是互相独立的。这也是DP和分治的最大区别之一。这题我从a走到b,和a之前b之后的格子完全没有关系啊!

so,冷静一下再看看,你会发现从1走到3和从2走到4其实是一样的,然后你会发现答案只与\(b-a\)有关。

举几个例子吧,1,2,3,5---卧槽,这是部分斐波那契啊,问题解决!

分析

通过举例子得到的规律只能帮你解题(这好像已经够了),有时候还有可能会错。

我们的问题是求从a到达b的路线数,令n=b-a,即求\(F(n)\)。有两种方式到达b,那就是从b-1和b-2过来,所以有\(F(n)=F(n-1)+(n-2)\)

于是有\(F(1)=1,F(2)=2,...F(n)=F(n-1)+(n-2)\)

另外,程序预处理数组,此题的查询复杂度为\(O(1)\)

考点:斐波那契数列的转化与应用。

坑点:数据可能会超出int范围;请不要递归,预处理数组最佳。

参考代码

//// Created by AlvinZH on 2017/9/19.// Copyright (c) AlvinZH. All rights reserved.//#include 
using namespace std;long long F[55];int n,a,b;int main(){ F[1]=1; F[2]=2; for (int i = 3; i <= 50; i++)//预处理 F[i] = F[i-1] + F[i-2]; scanf("%d",&n); while (n--) { scanf("%d%d", &a, &b); printf("%lld\n", F[b-a]); } return 0;}

转载于:https://www.cnblogs.com/AlvinZH/p/7698958.html

你可能感兴趣的文章
POJ1734【Floyd求最小环板子】
查看>>
linux环境下apache2与tomcat6的负载配置
查看>>
powerdesigner相关概念理解
查看>>
第八章 异常控制流
查看>>
maven在Idea建立工程,运行出现Server IPC version 9 cannot communicate with client version 4错误...
查看>>
【MediaKit】WPF项目中 调用摄像头拍照的开发包
查看>>
使用Pig对手机上网日志进行分析
查看>>
Linux trace使用入门
查看>>
Apache ab 单测 分布式
查看>>
《剑指offer》-链表的第一个公共节点
查看>>
求DNA序列中各个碱基的含量
查看>>
计算机网络课堂笔记3.15
查看>>
Learning Cpp----Comliling your first program
查看>>
Microsoft.Net框架程序设计学习笔记(5):延迟签名
查看>>
html5特性
查看>>
关于我在安装2.6.9版本bochs虚拟机时遇到的问题以及解决过程
查看>>
Linux系统克隆为iso镜像盘(类似win gost)
查看>>
2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流
查看>>
Android 修改Activity标题样式 actionBar
查看>>
OpenCV播放视频
查看>>