标签:概率dp
本题需要注意题目说期望小于1e6,那么呆在那个点的概率为1的点肯定从起点出发不可达的点。否则期望会无穷大。
dp[i][j]表示从(i,j)到(r,c)所需要的期望能量。
/************************************************************************* > File Name: t.cpp > Author: acvcla > Mail: acvcla@gmail.com > Created Time: 2014年10月21日 星期二 21时33分55秒 ************************************************************************/ #include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<map> #include<queue> #include<stack> #include<string> #include<cstdlib> #include<ctime> #include<set> #include<math.h> using namespace std; typedef long long LL; const int maxn = 1e3 + 10; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back double dp[maxn][maxn]; int r,c; double Div(int a,int b){ return double(a)/b; } struct p { double p1,p2,p3; }P[maxn][maxn]; int main(int argc, char const *argv[]) { 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].p1,&P[i][j].p2,&P[i][j].p3); } } //memset(dp,0,sizeof dp); dp[r][c]=0; for(int i=r;i>=1;i--) for(int j=c;j>=1;j--){ dp[i][j]=0; if(i==r&&j==c||P[i][j].p1==1)continue; dp[i][j]=(dp[i+1][j]*P[i][j].p3+dp[i][j+1]*P[i][j].p2+2)/(1-P[i][j].p1); } printf("%.3f\n",dp[1][1]); } return 0; }
标签:概率dp
原文地址:http://blog.csdn.net/acvcla/article/details/40457189