1331 小明上楼梯 II

描述

小明每次回家都要上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;
}



你可能感兴趣的:(1331 小明上楼梯 II)