同步发表于我的洛谷博客。

NOIP2013提高问题求解2:

现有一只青蛙,初始时在n号荷叶上。当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,……,k号荷叶之一上,直到跳到第1号荷叶为止。当n=2时,平均一共跳2次,n=3时,平均一共跳2.5次。当n等于5时,平均一共跳几次。

先将问题转为青蛙随机跳了一步以后的情况,分为5种情况,分别是落在1号、2号、3号、4号、5号荷叶上。每种情况发生的概率为1/5。

然后设f(n)为n片荷叶所需的平均次数。显然,f(1)=1。

先从简单的考虑:

  1. n=2
  2. 2种情况:落在1号或2号上。
  3. 落在1号上,问题变为求f(1)。
  4. 落在2号上,问题变为求f(2)+1

Q:为什么要加1?

A:因为它已经跳过一次了。

Q:为什么f(1)不用?

A:因为它已经到了。

由于是求平均值,且f(1)已知,那么可列方程:

f(2)=(f(1)+1+f(2))*1/2

解得f(2)=2。

Q:为什么要把所有的相加?

A:请考虑加法原理。

然后到n=3的状态:

  1. 3种情况:落在1号或2号或3号上。
  2. 落在1号上,问题变为求f(1)。
  3. 落在2号上,问题变为求f(2)+1
  4. 落在3号上,问题变为求f(3)+1

熟不熟悉?

每一个原问题都可以分成n个子问题,子问题规模变小(???),子问题相加即可求得原问题的答案。

有点递归的感觉。

来看看扩展到n=k的状态:

  1. k种情况:落在1号或2号或3号或……或k号上。
  2. 落在1号上,问题变为求f(1)。
  3. 落在2号上,问题变为求f(2)+1
  4. 落在3号上,问题变为求f(3)+1
  5. ……
  6. 此处省略
  7. ……
  8. 落在k号上,问题变为求f(k)+1

可得方程f(k)=(f(1)+1+f(2)+1+f(3)+······+1+f(k))*1/k

接下来,对上面这个方程进行合并同类项:

k*f(k)=(f(1)+1+f(2)+1+f(3)+······+1+f(k))

k*f(k)=k-1+(f(1)+f(2)+f(3)+······+f(k))

(k-1)*f(k)=k-1+(f(1)+f(2)+f(3)+······+f(k-1))

f(k)=1+(f(1)+f(2)+f(3)+······+f(k-1))*1/k

至此,f(n)的递推公式就被我们推出了:

f(n)=1+(f(1)+..f(n-1))/(n-1)

这道题的难点也就在于递推公式的推出,推出递推公式,n=5神马的,都是渣渣。

好了,now,来个总结:首先我们先用递归的思想,来尝试着把问题缩小规模,规模缩小后,就可以列出关系式了。再从一般到特殊,列出一般情况下的关系式后,化简,我们发现化简后的式子的形式形如递推式,那么,我们就可以自下往上来求解了。

实际上,有时候递推和递归从本质上来说,并无差别。有些时候我们用递归的思想来考虑问题,用递推的方式来实现求解,这样可以大大减小思维难度及代码实现难度。

至于为什么递推和递归从本质上来说,并无差别。首先得搞清楚,这是对于一个能用递推求解的问题而言的。

因为任何循环都可以用递归写(只要你胆够大,不怕爆0),而一般我们实现递推无非就是循环+数组之类的了。所以,递推一定可以用递归来实现。For example,斐波那契数列。(想想动态规划吧,dfs无非就是把复杂度增加了而已)但请注意,不是所有的递归都可以用循环实现滴,比如说,回溯法。那么,可得出:递归不一定可以用递推来实现。

希望对你能有帮助,哪怕一点点,我也满足了。

可转载,请注明作者及其来源。

NOIP2013提高问题求解T2(关于递推与递归)的更多相关文章

  1. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  2. 【Luogu】【关卡2-12】递推与递归二分(2017年10月)

    任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...

  3. 观光公交 2011年NOIP全国联赛提高组(贪心,递推)

    观光公交 2011年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold       题目描述 Description 风景迷人的小城 Y 市 ...

  4. NOIP2013提高组 T2 火柴排队

    一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...

  5. 0x02 递推与递归

    [例题]CH0301 递归实现指数型枚举 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  6. 题解报告:hdu 2084 数塔(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...

  7. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

  8. 「学习笔记」递推 & 递归

    引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...

  9. (acwing蓝桥杯c++AB组)1.2 递推

    1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...

随机推荐

  1. DevExpress ASP.NET Core v19.1版本亮点:Visual Studio集成

    行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Core Controls v19.1中新增的一些控件及增强 ...

  2. idea中使用JRebel插件

    首先 等待下载 点击Restart idea (重启idea) 然后等待idea 进行激活 记得勾选下面的那个复选框 激活url:http://139.199.89.239:1008/88414687 ...

  3. QT:圆角设置

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...

  4. 关于session、cookie、sessionStorage、localStorage的简要理解

    一.cookie和session 首先session和cookie用于浏览器客户端与服务端进行数据交互,通过会话的方式跟踪浏览器用户身份 (1) cookie 1.1) 一般由服务器生成,可以设置失效 ...

  5. cogs1682. [HAOI2014]贴海报 x

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] Bytetow ...

  6. Struts2笔记(学struts2只需要这一篇文章)

    1.如何将struts2框架引入到web项目中      1.把struts2相关jar包引入到项目中 2.把struts2的配置文件直接放到src下面,名字要叫做struts.xml.(运行时配置文 ...

  7. Android 属性动画监听事件与一个菜单的例子

    简单监听事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  8. Anaconda cheat sheet

    1 anaconda prompt 闪退的情况 在cmd中进入C:\ProgramData\Anaconda3\Scripts然后可以使用各种conda命令 2 anaconda 换源 # 方法参考 ...

  9. spring-boot:run启动时,如何带设置环境参数dev,test.

    这边在linux 启动springboot的jar包时候,多次报错 最终使用 java -jar -Dspring.profiles.active=test demo-0.0.1-SNAPSHOT.j ...

  10. Java多线程核心知识

    多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...