POJ 2096 【期望DP】
2015-12-18 14:30
731 查看
题意:
有n种选择,每种选择对应m种状态。每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等。
求n种选择和m种状态中每种至少发生一次的期望。
期望DP好别扭啊。要用倒推的方法。
dp[i][j]表示已经发生了i种选择,j种状态。
那么由dp
[m]这个时刻到最终时刻的期望是0.
而我们的起始时刻是dp[0][0]。
而dp[i][j]可以转移到四种情况,
1 dp[i][j]本身
2 dp[i+1][j]
3 dp[i][j+1]
4 dp[i+1][j+1]
那么dp[i][j]表示的期望是他能够转移到别的所有的情况的期望乘其权值的和。
好的。这大概就是期望DP的精髓了...
有n种选择,每种选择对应m种状态。每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等。
求n种选择和m种状态中每种至少发生一次的期望。
期望DP好别扭啊。要用倒推的方法。
dp[i][j]表示已经发生了i种选择,j种状态。
那么由dp
[m]这个时刻到最终时刻的期望是0.
而我们的起始时刻是dp[0][0]。
而dp[i][j]可以转移到四种情况,
1 dp[i][j]本身
2 dp[i+1][j]
3 dp[i][j+1]
4 dp[i+1][j+1]
那么dp[i][j]表示的期望是他能够转移到别的所有的情况的期望乘其权值的和。
好的。这大概就是期望DP的精髓了...
#include<stdio.h> #include<string.h> double dp[1005][1005]; int main() { int n,m; scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); for(int i=n;i>=0;i--) { for(int j=m;j>=0;j--) { if(i!=n||j!=m) dp[i][j]=(dp[i][j+1]*(m-j)*i/((double)(m*n))+dp[i+1][j]*(n-i)*j/((double)(m*n))+dp[i+1][j+1]*(n-i)*(m-j)/((double)(m*n))+1)/((double)(1-((double)(i*j))/(m*n))); } } printf("%.4lf\n",dp[0][0]); }
相关文章推荐
- jQuery each
- 使用 SDWebImage 应该在 AppDelegate 写的代码
- Android笔记:Webview 支持 input type=file选择上传图片
- java web权限管理
- hdu-1395 2^x mod n = 1
- JAVA修改文件名
- apache服务器的安装与使用
- Java初级开发中常常遇到的Bug 系列
- bzoj3329 Xorequ
- GTK+重拾--08 GTK+中的对话框
- hdu-1002 A + B Problem II
- Android 性能优化总结
- JAVA Maven项目如何实现定时任务
- leetcode(58)Length of Last Word js代码实现
- LeetCode 172:Factorial Trailing Zeroes
- spring 事务配置
- Remove '@override' annotation解决办法
- hdu-1202 The calculation of GPA
- Xcode自定义Eclipse中常用的快捷键
- SQL常用增删改查语句