1331 小明上楼梯 II

来源:互联网 发布:中电数据董事长李世峰 编辑:程序博客网 时间:2024/05/01 17:39
描述

小明每次回家都要上n级楼梯。有时小明一次上1级楼梯,有时一次上2级楼梯。现在小明每次随机走1级或2级楼梯,请问它若恰好上到第n级楼梯时,次数的期望值。(如果在第n-1的位置要上2级楼梯,则整个过程作废)

输入

第一行是1个正整数t,表示有t组数据,以下t行每行有1个正整数n,表示需要走n级楼梯(n <= 30)。

输出

对于每个n,输出一个整数,即上这n级楼梯的期望次数,小数点后保留2位。


样例输入5
1
2
3
5
10
样例输出
1.00
1.33
2.20
3.48
6.78
提示

先计算第i次上楼梯时所在位置的概率分布。


这是一道数学题,思路如下:
首先我设了一个数组p[i], 用来记录登上第i个台阶的概率, 比如登上台阶1的概率是1/2, 登上台阶2的概率是3/4 = 1/2+1/2*1/2
具体公式是: p[i] = 1- p[i-1]/2

然后现在考虑登上台阶i需要的次数的期望e[i], 显然可以用在i-1台阶的时候登1级台阶或者i-2台阶的时候登2级台阶来到达, 而这里关键是这两者的概率分别是多少
假设前者的概率是p1, 后者的概率是p2,
运用条件概率公式(这里可能其实是贝叶斯公式 ) p1 = p[i-1]* 1/2 / p[i]; p2 = p[i-2]* 1/2 / p[i];
然后计算期望: e[i] = p1*(e[i-1]+1)+p2*(e[i-2]+1); 


此题先打表比较好


#include<cstdio>#include<cstring>#include <iostream>using namespace std;int main(){int number,t;int op;int i;double p[32];double pp1,pp2;double e[32];p[1]=0.5;p[2]=0.75;for(i=3;i<=31;i++){p[i]=1-p[i-1]/2;}e[1]=1.00;e[2]=4.0/3.0;for(i=3;i<=30;i++){pp1=p[i-1]*0.5/p[i];pp2=p[i-2]*0.5/p[i];e[i]=pp1*(e[i-1]+1)+pp2*(e[i-2]+1); }scanf("%d",&number);for(t=1;t<=number;t++){scanf("%d",&op);printf("%.2lf\n",e[op]);}return 0;}