题意:一个三角形的结构,第一行有一个,第二行有二个……,你处于第一行,需要达到最后一行的第一个,最左边的只能向左下和右下走,其他的可以向左、向左下和向右下走,求达到目的地的长度的期望。
思路:
对于数学期望的定义是这样的。数学期望
E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn)
比如打靶打中8环的概率为0.3 ,打中7环的概率为0.7,那么打中环数的期望就是 8*0.3 + 7*0.7
本题中对于左边没有屋子的只能向左下和右下走,概率为a,b,对于左边,左下,右下都有屋子的,三种方向都可以走,概率为 e,c,d,对于没有左下,没有右下只能向左走的概率为1.问从顶部到左下角期望走的步数。
就是求数学期望,但预先不知道离散的走的步数。所以需要用到期望的离散性质。
本题中我们用dp[i][j] 表示当前位置距离目的地 还需要走 的期望步数。那么目的地假设为dp[n][1] (根据建的坐标不一样,位置也不一样),那么dp[n][1]的值为0,因为不需要再走了,那么我们所求的就是dp[1][1] 开始的地方。所以解题的过程,就是一个逆推的过程。
参考链接:http://www.tuicool.com/articles/zAJv2uM
#include <iostream> #include <string.h> #include <iomanip> using namespace std; double dp[100][100]; int n; double a,b,c,d,e; int main() { while(cin>>n&&n) { cin>>a>>b>>c>>d>>e; memset(dp,0,sizeof(dp)); dp[n][1]=0; for(int i=2; i<=n; i++) dp[n][i]+=1*(dp[n][i-1]+1);//处理最后一行 for(int i=n-1; i>=1; i--) //从倒数第二行开始处理 { dp[i][1]+=a*(dp[i+1][1]+1)+b*(dp[i+1][2]+1);//处理每一行的第一列 for(int j=2; j<=n; j++) dp[i][j]+=c*(dp[i+1][j]+1)+d*(dp[i+1][j+1]+1)+e*(dp[i][j-1]+1);//处理每一行的除了第一列以外的其它列 } cout<<setiosflags(ios::fixed)<<setprecision(2)<<dp[1][1]<<endl; } return 0; }