2013山东省第四届ACM省赛 The number of steps

题意:一个三角形的结构,第一行有一个,第二行有二个……,你处于第一行,需要达到最后一行的第一个,最左边的只能向左下和右下走,其他的可以向左、向左下和向右下走,求达到目的地的长度的期望。

思路:

对于数学期望的定义是这样的。数学期望

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;
}

你可能感兴趣的:(2013山东省第四届ACM省赛 The number of steps)