P2059 [JLOI2013]卡牌游戏

这是一道可怕的概率dp。

如果\(n=1\),那么胜率100%。

如果\(n=2\),可以暴力算出答案。

如果\(n=3\),可以发现,当淘汰了其中的某个人的时候,局面就会变成\(n=2\)的其中一个局面!

所以我们按\(n\)从小到大递推,可以逐步算出答案。

具体看看我抄过来的代码8:

for(int i = 2; i <= n; ++i)//根据i-1人环,求出i人环的情况
        for(int k = 1; k <= m; ++k)//枚举本轮庄家选择的牌
        {
            int p = (a[k] % i == 0) ? i : a[k] % i;
            //如果取a[k],第a[k] % i(用p记录)人被淘汰,下一轮p+1坐庄

            for(int j = 1; j <= i-1; ++j)// 环中除了自己的其他人
            {
                ++p;//下一个人
                if(p > i)
                    p = 1;              
                f[i][p] += f[i-1][j] / (double)(m);
            }
        }

最后的答案就是\(dp[n][i] \times 100 \%\)

preference

https://www.luogu.org/blog/costudy/solution-p2059

posted @ 2019-06-01 14:41  Garen-Wang  阅读(129)  评论(0编辑  收藏  举报