zoj 3822 Domination (概率dp 天数期望)
2014-10-13 20:52
399 查看
题目链接
参考博客:/article/2058697.html
题意:给定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
[m][i] - dp
[m][i-1])* i; (i = [1, n*m])
做了后一道概率dp,发现也可以用期望你逆推的方法。
可参照博客:http://blog.csdn.net/smz436487/article/details/40049189
初始化:dp[i]
[m]=0;(0<=i<=n*m)
dp[0][0][0]就是答案。
2维的没办法描述每种状态下的概率
代码:
参考博客:/article/2058697.html
题意:给定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
[m][i] - dp
[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 = 50+10; using namespace std; double d[maxn][maxn][2600]; int main() { double ans; int t, i, j, k, n, m; cin>>t; while(t--) { cin>>n>>m; memset(d, 0, sizeof(d)); d[0][0][0] = 1; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) for(k = 1; k <= n*m; k++) { int sum = n*m-k+1; d[i][j][k] = d[i][j][k-1]*((i*j-k+1)*1.0/sum*1.0)+ //因为这里还加上了已经覆盖了i行j列的概率,所以dp[i][j][k] 表示当前用了<=k个chess ,覆盖了i行j列(i*j的格子 每行至少一个,每列至少一个)的概率。 d[i-1][j][k-1]*(j*(n-i+1)*1.0/sum*1.0)+ d[i][j-1][k-1]*(i*(m-j+1)*1.0/sum*1.0)+ d[i-1][j-1][k-1]*((n-i+1)*(m-j+1)*1.0/sum*1.0); } ans = 0; for(i = 1; i <= n*m; i++) ans += (d [m][i]-d [m][i-1])*i; //减去表示用i个棋子覆盖的概率。 printf("%.12lf\n", ans); } return 0; }
做了后一道概率dp,发现也可以用期望你逆推的方法。
可参照博客:http://blog.csdn.net/smz436487/article/details/40049189
初始化:dp[i]
[m]=0;(0<=i<=n*m)
dp[0][0][0]就是答案。
2维的没办法描述每种状态下的概率
代码:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; double dp[2505][55][55]; int main() { int t,n,m; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); for(int i=n*m-1;i>=0;i--){ for(int j=n;j>=0;j--){ for(int k=m;k>=0;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+1][j][k]*p1+dp[i+1][j+1][k]*p2+dp[i+1][j][k+1]*p3+dp[i+1][j+1][k+1]*p4+1; } } } printf("%.10lf\n",dp[0][0][0]); } return 0; }
相关文章推荐
- zoj 3822 Domination 【概率DP 求期望】
- [zoj 3822]2014牡丹江区域赛 Domination 概率dp求期望
- ZOJ 3822 Domination 概率DP求期望
- 概率DP ZOJ 3822 Domination
- ZOJ 3822 Domination(概率dp 牡丹江现场赛)
- ZOJ 3822 Domination(概率dp)
- -----概率DP ZOJ 3822- Domination
- ZOJ 3822 Domination (三维概率DP)
- ZOJ 3822 Domination 期望dp
- ZOJ 3822 Domination【概率dp】
- ZOJ-3822-Domination【概率dp】【2014牡丹江赛区】
- ZOJ 3822 Domination(概率dp)
- [概率dp] zoj 3822 Domination
- ZOJ 3822 Domination 概率dp 难度:0
- ZOJ 3822 Domination(概率dp)
- ZOJ 3822 Domination(概率dp)
- zoj 3822(概率dp期望)
- ZOJ 3822 Domination 概率DP入门
- ZOJ 3822 Domination 期望dp
- ZOJ 3822 Domination (概率期望)