题目链接

参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297

题意:给定n*m的空棋盘

每一次在上面选择一个空的位置放置一枚棋子,直至每一行每一列都至少有一个棋子,求放置次数的期望

分析:

dp[i][j][k] 表示当前用了<=k个chess ,覆盖了i行j列(i*j的格子 每行至少一个,每列至少一个)的概率。

dp[i][j][k] 由 dp[i][j][k-1] , dp[i-1][j][k-1], dp[i][j-1][k-1], dp[i-1][j-1][k-1]得到,分别表示 添加的新的一个chess, 不覆盖新的行列, 只新覆盖一行, 只新覆盖一列, 同时新覆盖一行和一列,得到dp[i][j][k]。
递推时, 每个概率 * (可以覆盖的点数/剩余所有的空点数) 相加得到[i][j][k].

ans += (dp[n][m][i] - dp[n][m][i-1])* i;  (i = [1, n*m])

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define LL __int64
const int maxn = +;
using namespace std;
double d[maxn][maxn][]; int main()
{
double ans;
int t, i, j, k, n, m;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(d, , sizeof(d));
d[][][] = ;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
for(k = ; k <= n*m; k++)
{
int sum = n*m-k+;
d[i][j][k] = d[i][j][k-]*((i*j-k+)*1.0/sum*1.0)+ //因为这里还加上了已经覆盖了i行j列的概率,所以dp[i][j][k] 表示当前用了<=k个chess ,覆盖了i行j列(i*j的格子 每行至少一个,每列至少一个)的概率。
d[i-][j][k-]*(j*(n-i+)*1.0/sum*1.0)+
d[i][j-][k-]*(i*(m-j+)*1.0/sum*1.0)+
d[i-][j-][k-]*((n-i+)*(m-j+)*1.0/sum*1.0);
}
ans = ;
for(i = ; i <= n*m; i++)
ans += (d[n][m][i]-d[n][m][i-])*i; //减去表示用i个棋子覆盖的概率。 printf("%.12lf\n", ans);
}
return ;
}

做了后一道概率dp,发现也可以用期望你逆推的方法。

可参照博客:http://blog.csdn.net/smz436487/article/details/40049189

初始化:dp[i][n][m]=0;(0<=i<=n*m)

dp[0][0][0]就是答案。

2维的没办法描述每种状态下的概率

代码:

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
double dp[][][];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(dp,,sizeof(dp));
for(int i=n*m-;i>=;i--){
for(int j=n;j>=;j--){
for(int k=m;k>=;k--){
if(j==n&&k==m)continue;
if(j*k<i)continue;
double p1,p2,p3,p4;
p1=1.0*(j*k-i)/(n*m-i);
p2=1.0*(n-j)*k/(n*m-i);
p3=1.0*(m-k)*j/(n*m-i);
p4=1.0*(n-j)*(m-k)/(n*m-i);
dp[i][j][k]=dp[i+][j][k]*p1+dp[i+][j+][k]*p2+dp[i+][j][k+]*p3+dp[i+][j+][k+]*p4+;
}
}
}
printf("%.10lf\n",dp[][][]);
}
return ;
}

最新文章

  1. 再谈JavaScript闭包及应用
  2. 史上最全的Ajax基础详解
  3. C#函数、参数数组(例子)★
  4. cbitmap 获取RGB CBitMap的用法
  5. mysqldump when doing LOCK TABLES问题
  6. hdu2044java递推
  7. 蜗牛爱课 -- iOS 设置UIButton的字体的大小、显示位置、大小
  8. hdu 4893 Wow! Such Sequence!
  9. 在asp.net webservice中如何使用session
  10. Sencha Extjs4.2 皮肤制作
  11. hexdump命令的使用
  12. Android开发之常见事件响应方式
  13. 用户空间网络提升 NFV 的性能
  14. 20175303 2018-2019-2 《Java程序设计》第8周学习总结
  15. 2018.5.3 maven
  16. linux中搭建vue-cli
  17. 多进程vs多线程
  18. Python3解《剑指》问题:“遇到奇数移至最前,遇到偶数移至最后”
  19. python-flask-路由匹配源码分析
  20. fopen()、fwrite()、fread()函数使用说明与示例

热门文章

  1. jQuery中的height()、innerheight()、outerheight()的区别总结
  2. 简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
  3. 驱动笔记 - file_operations
  4. Level2行情和传统行情的区别
  5. A Product Array Puzzle
  6. HDU 4496 D-City(并查集,逆思维)
  7. 使用git了解代码编写过程
  8. MJRefresh插件引起的错误
  9. iOS-CALayer图片淡入淡出动画
  10. iOS第三方(显示视图的宽度高度)- MMPlaceHolder