• 2014牡丹江——Domination


    题目链接

    • 题意:
      给一个n*m的矩阵,每天随机的在未放棋子的格子上放一个棋子。求每行至少有一个棋子,每列至少有一个棋子的天数的期望
       (1 <= N, M <= 50). 
    • 分析:
      比較明显的概率DP,难点在于怎样设计状态。覆盖了多少行和列是不可缺少的,之后比較关键的就是想到还有一个属性:多少个交叉点(即放过的点)
    double dp[55][55][2550];
    bool vis[55][55][2550];
    int tot;
    int n, m;
    inline double getp(int xx, int yy)
    {
        return (xx * 1.0) / yy;
    }
    double dpf(int x, int y, int z)
    {
        if (x > n || y > m || z > tot) return 0;
        if (x == n && y == m) return 0.0;
    
        if (vis[x][y][z]) return dp[x][y][z];
        vis[x][y][z] = true;
    
        int a = x * y - z;
        int b = tot - (x * m + y * n - x * y);
        int xc = x * m - x * y;
        int yc = y * n - x * y;
    
        int sum = a + b + xc + yc;
        dp[x][y][z] = 0;
    
        if (a)
            dp[x][y][z] += getp(a, sum) * dpf(x, y, z + 1);
        if (b)
            dp[x][y][z] += getp(b, sum) * dpf(x + 1, y + 1, z + 1);
        if (xc)
            dp[x][y][z] += getp(xc, sum) * dpf(x, y + 1, z + 1);
        if (yc)
            dp[x][y][z] += getp(yc, sum) * dpf(x + 1, y, z + 1);
        dp[x][y][z] += 1.0;
        return dp[x][y][z];
    }
    
    
    int main()
    {
        int T;
        RI(T);
        while (T--)
        {
            RII(n, m); tot = n * m;
            memset(vis, 0, sizeof(vis));
            printf("%.12lf
    ", dpf(0, 0, 0));
        }
        return 0;
    }
    


  • 相关阅读:
    zookeeper.Net
    转码和解码
    Node.js开发Web后台服务
    SQL Server 2012 读写分离设置
    使用C# 和Consul进行分布式系统协调
    http2
    .net core 2.1.3可能引发Could not load file or assembly XXXXX的错误
    jquery on函数和prop与attr区别
    html页面中完成查找功能
    C#匿名参数(转载too)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5180916.html
Copyright © 2020-2023  润新知