2004 TCCC OL1 div1 1000(概率dp,简单)

来源:互联网 发布:如何进行数据预处理 编辑:程序博客网 时间:2024/06/07 11:32

题意:
有一片水塘,用string来表示
比如”.XX”(保证第一个位置是’.’),表示以该形式向右边无穷拓展”.XX.XX.XX····”(X表示障碍物
你站在水塘左边,准备打水漂,石子碰到障碍物就沉了。。
石子有一个maxDist属性,每一次弹射时在[1, maxDist]区间内随机选一个距离。每弹一次maxDist减1,也就是在不碰到任何障碍物的情况下,石子最多弹射maxDist次(不算最初到0的那次
石子先打到0,然后开始弹。。
求石子不碰到障碍物的概率
思路:
设当前在i,maxDist = d
P(i, j) 表示在i位置,maxDist为j时的不碰到石子的概率。。
那么 P(i, d) = P( (i+1)%n, d-1) + … + P( (i+d)%n, d-1)
如果i位置是障碍物,直接为0

const int Maxn = 100;int  n;double dp[Maxn+5][Maxn+5];class RockSkipping{        public:        double probability(string pads, int maxDist)        {        n = pads.length();        for (int i=0;i<n;++i) dp[i][1] = (pads[i] == '.' && (pads[(i+1)%n] == '.'));        //for (int i=0;i<n;++i) cout << i << ' ' << 1 << ": " << dp[i][1] << endl;        for (int k=2;k<=maxDist-1;++k) {            double p = 1.0/k;            for (int i=0;i<n;++i) {                if (pads[i] != '.') { dp[i][k] = 0; continue; }                double t = 0;                for (int j=1;j<=k;++j) {                    t += dp[(i+j)%n][k-1] * p;                }                dp[i][k] = t;            }        }        double ret = 0, p = 1.0/maxDist;        for (int i=1;i<=maxDist;++i) ret += dp[i%n][maxDist-1] * p;        return ret*100;        }} 
0 0