码迷,mamicode.com
首页 > 其他好文 > 详细

zoj 3822 概率dp

时间:2014-11-28 22:37:26      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   sp   for   on   div   

 1 /*
 2 题目大意:一个n*m的棋盘,每天放一个棋子,每行每列至少有一个棋子时结束。求达到每行每列至少有一个棋子的天数的数学期望。
 3 */
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 using namespace std;
 8 
 9 const int maxn=55;
10 double dp[maxn*maxn][maxn][maxn];//放i颗棋子,j行有棋子,k列有棋子
11 
12 int main()
13 {
14     int t,n,m,i,j,k;
15     scanf("%d",&t);
16     while(t--)
17     {
18         scanf("%d%d",&n,&m);
19         memset(dp,0,sizeof(dp));
20         dp[0][0][0]=1;
21         int top=n*m;
22         for(i=1;i<=top;i++)
23         {
24             for(j=1;j<=i && j<=n;j++)
25             {
26                 for(k=1;k<=i && k<=m;k++)
27                 {
28                     dp[i][j][k]=dp[i-1][j][k-1]*((m-k+1)*j)/(n*m-i+1)+//原有行,新的列中
29                                 dp[i-1][j-1][k]*((n-j+1)*k)/(n*m-i+1)+//原有列,新的行中
30                                 dp[i-1][j-1][k-1]*((n-j+1)*(m-k+1))/(n*m-i+1);//新的行,新的列中
31                     if(!(n==j && m==k))//没到终点可以放在原有行,原有列中
32                         dp[i][j][k]+=dp[i-1][j][k]*(j*k-i+1)/(n*m-i+1);
33                 }
34             }
35         }
36         double ans=0;
37         for(i=1;i<=top;i++)
38             ans+=dp[i][n][m]*i;
39         printf("%.10lf\n",ans);
40     }
41     return 0;
42 }

 

zoj 3822 概率dp

标签:style   blog   io   color   os   sp   for   on   div   

原文地址:http://www.cnblogs.com/xiong-/p/4129426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!