• ZOJ 3822 Domination


    题意:

    一个棋盘假设每行每列都有棋子那么这个棋盘达到目标状态  如今随机放棋子  问达到目标状态的期望步数

    思路:

    用概率来做  计算第k步达到目标状态的概率  进而求期望  概率计算方法就是dp  dp[k][i][j]表示第k步有i行被覆盖j列被覆盖  转移仅仅有4种  —— 同一时候覆盖行列  覆盖行  覆盖列  不覆盖  状态数50^4  非常easy

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<set>
    #include<vector>
    #include<queue>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    #define N 55
    
    int t, n, m;
    double dp[N * N][N][N], ans;
    
    int main() {
    	int i, j, k;
    	scanf("%d", &t);
    	while (t--) {
    		memset(dp, 0, sizeof(dp));
    		dp[0][0][0] = 1;
    		ans = 0;
    		scanf("%d%d", &n, &m);
    		for (k = 1; k <= n * m; k++) {
    			for (i = 0; i <= n; i++) {
    				for (j = 0; j <= m; j++) {
    					if (i == n && j == m)
    						break;
    					int f00 = i * j - k + 1;
    					int f01 = i * (m - j);
    					int f10 = (n - i) * j;
    					int f11 = (n - i) * (m - j);
    					int sum = n * m - k + 1;
    					dp[k][i][j] += dp[k - 1][i][j] * f00 / sum;
    					dp[k][i + 1][j] += dp[k - 1][i][j] * f10 / sum;
    					dp[k][i][j + 1] += dp[k - 1][i][j] * f01 / sum;
    					dp[k][i + 1][j + 1] += dp[k - 1][i][j] * f11 / sum;
    				}
    			}
    			ans += dp[k][n][m] * k;
    		}
    		printf("%.10f
    ", ans);
    	}
    	return 0;
    }
    


  • 相关阅读:
    Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
    xss跨站脚本和csrf 跨站请求伪造
    随机32位字符
    Demura说明
    Demura介绍
    C# 调用c++编译dll
    数据结构之-数组
    C# 深克隆和浅克隆
    弹性盒子的知识点
    行为型设计模式之-观察者模式
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5193008.html
Copyright © 2020-2023  润新知