这类的的期望的问题,求某一点的期望的时候可能同当前点的期望有关系,可以通过移项可以将dp当前状态调整到一边。
记忆化搜索,通过递归的方法进行搜索,增加vs数组判断是否已经访问完成。递归出口要考虑全面。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
const int Len=1000+5;
double dp[Len][Len];
double p[Len][Len];
double l[Len][Len];
double r[Len][Len];
bool vs[Len][Len];
int rr,c;
double DP(int i,int j){
if(vs[i][j]){
return dp[i][j];
}
if(i==rr&&j==c){
return 0;
}
if(i>rr||j>c){
return 0;
}
else if(p[i][j]==1.0){
vs[i][j]=1;
return dp[i][j]=0;
}
vs[i][j]=1;
return dp[i][j]=(2+l[i][j]*DP(i,j+1)+r[i][j]*DP(i+1,j))/(1.0-p[i][j]);
}
int main(){
while(cin>>rr>>c){
memset(p,0,sizeof(p));
memset(vs,0,sizeof(vs));
for(int i=1;i<=rr;++i){
for(int j=1;j<=c;j++){
scanf("%lf%lf%lf",&p[i][j],&l[i][j],&r[i][j]);
}
}
memset(dp,0,sizeof(dp));
printf("%.3lf\n",DP(1,1));
}
}