ZOJ 3822 Domination(期望DP)

题目链接
题意

n*m的棋盘,占领一个格子可以控制这个行和列,每天随机占领一个格子直到控制所有行列。
求控制所有行列所需要占领格子的天数期望。

思路

DP开三个维度,DP[k][i][j],k表示天数,i表示已占领行数量,j表示已占领列数量
DP表示距离终点的期望

我们可以从终点倒着推,所有终点的期望都是0
dp[k] 可以由 dp[k+1] 推来
DP[K][I][J]的期望即下面五个式子之和
概率 * DP[K+1][I][J],到后一天控制不变
概率 * DP[K+1][I+1][J],到后一天多控制了一行
概率 * DP[K+1][I][J+1],到后一天多控制了一列
概率 * DP[K+1][I+1][J+1],到后一天多控制了一行和一列
1.0,到后一天花了一点期望
概率可以画个2*2的小方格瞎搞一下推得(具体概率见代码)。


代码
#include <stdio.h>
#include <string.h>

double dp[2][55][55];

int main()
{
    int t;
    for(scanf("%d",&t); t; --t)
    {
        int n, m, cur = 0;
        scanf("%d%d",&n,&m);
        memset(dp[cur],0,sizeof(dp[cur]));
        for(int k = n*m-1; ~k; --k)
        {
            cur ^= 1;
            memset(dp[cur],0,sizeof(dp[cur]));
            for(int i = 0; i <= n; ++i)
            {
                for(int j = 0; j <= m; ++j)
                {
                    if(i == n && j == m) continue;
                    if(k > i*j || (k < i && k < j)) continue;
                    dp[cur][i][j] += dp[cur^1][i][j] * (i*j-k)/(n*m-k);
                    dp[cur][i][j] += dp[cur^1][i+1][j] * ((n-i)*j)/(n*m-k);
                    dp[cur][i][j] += dp[cur^1][i][j+1] * ((m-j)*i)/(n*m-k);
                    dp[cur][i][j] += dp[cur^1][i+1][j+1] * (n-i)*(m-j)/(n*m-k);
                    dp[cur][i][j] += 1.0;
                }
            }
        }
        printf("%.12lf\n",dp[cur][0][0]);
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值