概率dp入门题
状态转移方程:dp[i][j]=dp[i][j+1]*pos2[i][j]/(1-pos1[i][j])+dp[i+1][j]*pos3[i][j]/(1-pos1[i][j])+2/(1-pos1[i][j]);
但要注意,当点(i,j)移动概率为1时,说明这点不应该到达。
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
int r,c;
double pos1[1111][1111],pos2[1111][1111],pos3[1111][1111],dp[1111][1111];
int main(){
while(scanf("%d%d",&r,&c)!=EOF){
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
scanf("%lf%lf%lf",&pos1[i][j],&pos2[i][j],&pos3[i][j]);
}
}
memset(dp,0,sizeof(dp));
for(int i=r;i>0;i--){
for(int j=c;j>0;j--){
if(r==i&&j==c)continue;
if(pos1[i][j]>=1.0)continue;
dp[i][j]=dp[i][j+1]*pos2[i][j]/(1-pos1[i][j])+dp[i+1][j]*pos3[i][j]/(1-pos1[i][j])+2/(1-pos1[i][j]);
}
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}