ZOJ Problem Set - 3822Domination(DP)

题目链接

题目大意:

给你一个n * m的棋盘,每天都在棋盘上面放一颗棋子,直到这个棋盘上的每行每列都有至少有一颗棋子。求要用的天数的期望。

解题思路:

先求出不同摆法的棋盘的概率,然后在和天数相乘就是期望。

我们将棋盘划分为四个部分:其中一部分为每行没列都至少有一个棋子。

然后得出状态转移方程:

dp[x][y][k]:表示x行y列已经满足要求,用了k个棋子。

dp[x][y][k + 1] = dp[x][y][k] *(x *y - k)/ (m * n - k);

dp[x][y][k + 1] = dp[x - 1][y][k] * (n - x + 1) * y / (n * m - k);

dp[x][y][k + 1] = dp[x][y - 1][k] * (m - y + 1) *x / (n *m - k);

dp[x][y][k + 1] = dp[x - 1][y - 1][k] *(m - y + 1) *(n - x + 1) / (n * m - k);

dp[0][0][0] = 1;并且dp[n][m][k] -= dp[n][m][k - 1].因为这个时候已经按要求覆盖了整个棋盘,但是再下第k颗棋子的时候,是有前面的k - 1颗棋子的总数来决定的,但是到k - 1的时候其实就是可以停止的,而之前这个种类已经加过了,所以减掉。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 55;

double dp[maxn][maxn][maxn * maxn];

int main () {

    int T;
    int n, m;

    scanf ("%d", &T);
    while (T--) {

        dp[0][0][0] = 1;

        scanf ("%d%d", &n, &m);            

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                for (int k = 0; k < i * j; k++) {

                    dp[i][j][k + 1] = 0;
                    dp[i][j][k + 1]    += dp[i][j][k] * (i * j - k) / (n * m - k);
                    //printf ("%.12lf\n", dp[i][j][k + 1]);
                    if (i)
                        dp[i][j][k + 1] += dp[i - 1][j][k] * (n - i + 1) * j/ (n * m - k);
                    if (j)
                        dp[i][j][k + 1] += dp[i][j - 1][k] * (i * (m - j + 1)) / (n * m - k);
                    if (i && j)
                        dp[i][j][k + 1] += dp[i - 1][j - 1][k] * (n - i + 1) * (m - j + 1) / (n * m - k);
                }

        double ans = max(n, m) * dp[n][m][max(n, m)];
        for (int k = max(n, m) + 1; k <= n * m; k++)
            ans += k * (dp[n][m][k] - dp[n][m][k - 1]);

        printf ("%.12lf\n", ans);
    }
    return 0;
}
时间: 2024-11-05 16:34:28

ZOJ Problem Set - 3822Domination(DP)的相关文章

ZOJ Problem Set - 2563 Long Dominoes 【状压dp】

题目:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形,求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的,比较火,链接:这里 这个差不多,就是当前行的状态对上一行有影响,对上上一行也有影响.所以 定义状态:dp[i][now][up]表示在第 i 行状态为now ,上一行状态为 up 时的方案数. 然后转移方程:dp[i][now][up] = sum ( dp[i-1][up][uup] ) 前提是合法 合法性的判断是比

ZOJ Problem Set - 2297 Survival 【状压dp】

题目:ZOJ Problem Set - 2297 Survival 题意:给出一些怪,有两个值,打他花费的血和可以增加的血,然后有一个boss,必须把小怪所有都打死之后才能打boss,血量小于0会死,也不能大于100. 分析:定义状态:dp[st],表示在 st 状态下的血量. 然后转移:dp[st] = max (dp[st],dp[st&~(1<<i )]+p[i].first - p[i].second); 注意初始化的时候必须在开始初始化,否则容易出错. #include &

ZOJ Problem Set - 1013 Great Equipment ()

ZOJ Problem Set - 1013 Great Equipment Time Limit: 10 Seconds      Memory Limit: 32768 KB Once upon a time, there lived Catherine Ironfist, the Queen of Enroth. One day, she received the news of her father's death. So she sailed for Erathia to attend

ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题意:给出n个点,n-1条边的一棵树.然后要在两个点上建立两个消防站.让全部点的到消防站最大距离的点的这个距离最小. 分析:首先先求这个树的直径.然后在树的直径的中点处把树分成两棵树.然后在把两棵树分别取中点的最大值就是ans值. 这个题目数据有点水了感觉... AC代码: #include <cstdi

ZOJ Problem Set - 1025解题报告

ZOJ Problem Set - 1025 题目分类:动态规划 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1025   题目大意就是有很多木头,都有各自的长度和重量.现在要加工这些木头,如果加工某根木头的长度和重量大于等于它上一根木头的长度和重量,那么加工它不需要时 间,否则要花1分钟.现给出一堆木头的长度和重量,要求加工完这堆木头可以花的最少时间.例如给出5根木头长度重量分别为(4,9), (5,2),

BZOJ 2298 problem a(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2298 题意:一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 思路:对于第i个人来说,区间[ai+1,n-bi]的人的分数相同.那么我们用sum[L][R]表示区间[L,R]中总人数.用f[i]表示前i个人中说真话的最大人数,那么f[j]=max(f[i-1]+sum[i][j]). map<pair<in

ZOJ Problem Set - 3321 并查集

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321 Circle Time Limit: 1 Second      Memory Limit: 32768 KB Your task is so easy. I will give you an undirected graph, and you just need to tell me whether the graph is just a circle.

ZOJ Problem Set - 3804 YY&#39;s Minions

学习:换一个角度考虑问题.YY's Minions Time Limit: 2 Seconds      Memory Limit: 65536 KB Despite YY's so much homework, she would like to take some time to play with her minions first. YY lines her minions up to an N*M matrix. Every minion has two statuses: awake

ZOJ Problem Set - 3195 Design the city 【Tarjan离线LCA】

题目:ZOJ Problem Set - 3195 Design the city 题意:给出一个图,求三点的连起来的距离. 分析:分别求出三点中任意两点的距离 / 2  = ans AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; #define N 50010 #define M 20010 struc