HDU - 3853(简单概率dp , 注意边界)
2015-09-08 08:25
465 查看
本题目直接按题目意思推方程转移就行了,但是有个坑点,就是对于一个点i,j从1,1开始不可达,那么该点的p1(转移到自己)就有可能为1,所以当转移到一个点的概率为0的时候
那么就不往该点转移。
那么就不往该点转移。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <set> #include <map> #include <string> #include <list> #include <cstdlib> #include <queue> #include <stack> #include <cmath> #define ALL(a) a.begin(), a.end() #define clr(a, x) memset(a, x, sizeof a) #define fst first #define snd second #define pb push_back #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define rep1(i,x,y) for(int i=x;i<=y;i++) #define rep(i,n) for(int i=0;i<(int)n;i++) using namespace std; const double eps = 1e-10; typedef long long LL; typedef long long ll; typedef pair<int, int> pii; const int inf =0x3f3f3f3f; const int N = 1010; double p [4],E ; bool vis ; int n,m; double dp(int i,int j){ if(vis[i][j]) return E[i][j]; vis[i][j] = 1; if(i == n && j == m) return E[i][j] = 0; E[i][j]=2; if(j < m && p[i][j][2] > eps) E[i][j]+=dp(i,j+1)*p[i][j][2]; if(i < n && p[i][j][3] > eps) E[i][j]+=dp(i+1,j)*p[i][j][3]; E[i][j]/=(1-p[i][j][1]); return E[i][j]; } int main() { while(scanf("%d %d",&n,&m)==2){ rep1(i,1,n) rep1(j,1,m) scanf("%lf %lf %lf",&p[i][j][1],&p[i][j][2],&p[i][j][3]); memset(vis,false,sizeof(vis)); printf("%.3lf\n",dp(1,1)); } return 0; }
相关文章推荐
- 删除目录从里往外删除
- Gym - 100338E Numbers 贪心
- Properties类用于配置的
- 链表,多项式求和
- Apple 如何知道你使用了私有API
- 打印流printstream
- SQL 自动清除7天前数据前收缩数据库
- mysql基础2
- 对指定的目录进行递归获取递归过程所有的java文件的路径。
- 数据结构例程——线性表顺序存储的应用
- 代理的回调的例子
- Wix 安装部署教程(十五) --CustomAction的七种用法
- 罗辑思维
- 遍历递归目录下所有文件或文件夹
- file文件创建等
- 关于在C++中调用system函数
- mysql基础学习1
- 面试题摘选
- android学习—context 和 getApplicationContext()
- 剑指Offer系列---(8)重建二叉树