HDU 3853
2015-07-25 15:55
232 查看
概率DP,转移方程:dp[i][j]=p1[i][j]*dp[i][j]+p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2;
化简后可得: dp[i][j]=(p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2)/(1-p1[i][j]);
需要特判一下p1[i][j]==1的情况.
化简后可得: dp[i][j]=(p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2)/(1-p1[i][j]);
需要特判一下p1[i][j]==1的情况.
#include <iostream> #include <cstdio> using namespace std; int n,m; double dp[1005][1005]; double p1[1005][1005],p2[1005][1005],p3[1005][1005]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i = 1;i <= n;i ++) for(int j = 1;j <= m;j ++) { scanf("%lf%lf%lf",&p1[i][j],&p2[i][j],&p3[i][j]); } dp [m] = 0; for(int i = n;i >= 1;i --) for(int j =m;j >= 1;j --) { if(i==n&&j==m) continue; if(p1[i][j] == 1) continue; dp[i][j]=(p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2)/(1-p1[i][j]); } printf("%.3lf\n",dp[1][1]); } return 0; }