睡前小dp-hdu3853-概率dp
2015-12-06 23:29
225 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3853
膜猴烧酒madoka
讲定义为dp[i][j] 位置为ij的魔法值期望,可以发现dp[i][j] = dp[i][j]*p1[i][j]+dp[i][j+1]*p2[i][j]+dp[i+1][j]*p3[i][j]+2
最后可以表示为
递推的时候从右下角开始,向左上角递推。
有一个坑是p1=1 时,会出错,所以要特判一下。直接跳过。
膜猴烧酒madoka
讲定义为dp[i][j] 位置为ij的魔法值期望,可以发现dp[i][j] = dp[i][j]*p1[i][j]+dp[i][j+1]*p2[i][j]+dp[i+1][j]*p3[i][j]+2
最后可以表示为
dp[x][y] = 1.0/(1-p[x][y][0])*(p[x][y][1]*dp[x][y+1]+p[x][y][2]*dp[x+1][y]+2.0);
递推的时候从右下角开始,向左上角递推。
有一个坑是p1=1 时,会出错,所以要特判一下。直接跳过。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int R,C; double dp[1010][1010],p[1010][1010][3]; int main() { while(~scanf("%d%d",&R,&C)) { for(int i=1;i<=R;i++) { for(int j=1;j<=C;j++) { scanf("%lf%lf%lf",&p[i][j][0],&p[i][j][1],&p[i][j][2]); } } memset(dp,0,sizeof dp); for(int x=R;x>=1;x--) { for(int y=C;y>=1;y--) { if(x==R&&y==C) continue; if(abs(p[x][y][0]-1.0)<(1e-7)) continue; dp[x][y] = 1.0/(1-p[x][y][0])*(p[x][y][1]*dp[x][y+1]+p[x][y][2]*dp[x+1][y]+2.0); } } /* for(int i=1;i<=R;i++) { for(int j=1;j<=C;j++) { printf("%lf ",dp[i][j]); } printf("\n"); } */ printf("%.3lf\n",dp[1][1]); } }
相关文章推荐
- linux中ctrl+z和ctrl+c的区别
- JVM注解@CallSensitive
- Python——函数的高级话题(1)
- 一些常用的控制行命令
- dos命令大汇总
- NSUserDefaults偶尔/有时候保存数据会失败/失效
- jq参数以及e.target
- java基本常识
- Jenkins学习之——(3)将项目发送到tomcat
- 12.06 JavaScript
- 面向对象
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
- Date
- Book Review of “The practice of programming” (Ⅲ)
- Eclipse上安装GIT插件EGit
- STM32F407之I2C总线(一)
- C如何通过被调函数修改主调函数普通变量的值
- css 入门基础知识
- Emacs笔记
- String