zoukankan      html  css  js  c++  java
  • zoj3822 Domination 概率dp --- 2014 ACM-ICPC Asia Mudanjiang Regional Contest

    一个n行m列的棋盘,每次能够放一个棋子。问要使得棋盘的每行每列都至少有一个棋子 须要的放棋子次数的期望。

    dp[i][j][k]表示用了k个棋子共能占据棋盘的i行j列的概率。

    那么对于每一颗棋子,在现有的棋盘上,它可能有四种影响:新占了一行,新占了一列,既占了新的一行又占了新的一列。无影响。

    对于每一种情况。dp[i][j][k]=原始状态的概率×选到这种位置的概率

    最后算答案的时候注意到,题目问的是到第k个刚好放完n行m列。也就是最后一个棋子一定是有作用的,

    所以用dp[i][j][k]-dp[i][j][k-1]得到是第k个棋子恰好使得每行每列都占据的概率。


    #include<cstdio>
    #include<cstring>
    double dp[55][55][2550];
    int n,m;
    int main()
    {
        int T,i,j,k;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            int sum=n*m;
            for(i=0;i<=n;i++)
                for(j=0;j<=m;j++)
                    for(k=0;k<=sum;k++) dp[i][j][k]=0;
            dp[0][0][0]=1.0;
            for(k=1;k<=sum;k++)
                for(i=1;i<=n;i++)
                    for(j=1;j<=m;j++)
                    {
                        dp[i][j][k]+=(dp[i][j][k-1]*(i*j-k+1)*1.0/(sum-k+1));//加入的位置没有新增新行或新列
                        dp[i][j][k]+=(dp[i-1][j][k-1]*((n-i+1)*j)*1.0/(sum-k+1));//添加行不添加列
                        dp[i][j][k]+=(dp[i][j-1][k-1]*(m-j+1)*i*1.0/(sum-k+1));//添加列不添加行
                        dp[i][j][k]+=(dp[i-1][j-1][k-1]*(n-i+1)*(m-j+1)*1.0/(sum-k+1));//既添加列也添加行
                     //   printf("i:%d j;%d k;%d dp:%lf
    ",i,j,k,dp[i][j][k]);
                    }
            double ans=0;
            for(k=1;k<=sum;k++) ans+=(dp[n][m][k]-dp[n][m][k-1])*k;
            printf("%.10lf
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    谈谈严格模式
    javascript回调函数那些事~
    border-radius:50%和100%究竟有什么区别
    canvas浅谈 实现简单的自旋转下落
    js中关于this的理解
    对js 面对对象编程的一些简单的理解
    ios中 input 焦点光标不垂直居中
    只能输入数字的正则表达式在火狐的兼容问题解决方法
    关于margin、padding 对内联元素的影响
    element ui 表格的合并
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6999803.html
Copyright © 2011-2022 走看看