zoukankan      html  css  js  c++  java
  • bzoj 3191

    非常好的一道题

    看到这道题,肯定能想到概率dp,但是状态的设计与转移都是一个难点

    如果正向模拟来设计状态,那么不难发现是很难以转移的

    所以我们考虑反向模拟,用类似博弈的方法来转移

    不难发现,如果只剩了最后一个人,那么这个人获胜的概率是1

    而如果只剩两个人,我们完全可以通过摸牌的情况算出每个人的胜率(这里的胜率是先手和后手之分)

    而如果剩三个人,我们发现通过摸牌会先淘汰一个人,然后就变成了两个人的局势,同时可以找出一个人在三人局中的位置和他在两人局中位置的对应关系

    而这不就是一个转移吗

    其余更多部分也就是同理啦

    设状态为f[i][j]表示局中还剩i个人时,第j个人的胜率

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <stack>
    using namespace std;
    double f[55][55];
    int n,m;
    int a[55];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&a[i]);
        }
        f[1][1]=1;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int temp=a[j]%i;
                if(!temp)
                {
                    temp=i;
                }
                for(int k=1;k<i;k++)
                {
                    temp++;
                    if(temp>i)
                    {
                        temp=1;
                    }
                    f[i][temp]+=f[i-1][k]*(double)1.0/(double)m;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            printf("%.2lf%% ",f[n][i]*100.0);
        }
        return 0;
    }
  • 相关阅读:
    this和$(this)的关系
    单色边表格
    php概率算法
    jQuery Ajax 参数解析
    拍拍CPS入门使用
    飞鸽端口被占
    浏览器调试工具技巧分享
    事件click,bind,click
    jQuery旋转插件—rotate
    利用谷歌API生成二维码
  • 原文地址:https://www.cnblogs.com/zhangleo/p/10764142.html
Copyright © 2011-2022 走看看