HDU 3853確率dp
1433 ワード
テーマの大意
ある人はR*C(2<=R,C<=1000)の迷宮に閉じ込められ、最初は(1,1)という点で迷宮の出口は(R,C)だった.迷宮の各格子では、2つの魔法値を使って伝送路を開くことができます.彼が(x,y)という格子の中で、伝送路を開いた後、p_lift[i][j]の確率が送られ(x,y+1)、p_down[i][j]の確率が送られ(x+1,y)、p_がありますloop[i][j]の確率が送られる(x,y).彼に出口までかかる魔法の値の期待を聞いた.
典型的な自己から自己への移行は,式を解く必要がある.
令:f[i][j]は、(i,j)という点から出口(R,C)までかかる魔法値の期待を表す.では、次のようにします.
f[i][j] = p_loop[i][j]*f[i][j] + p_left[i][j]*f[i][j+1] + p_down[i][j]*f[i+1][j]移項可得:
(1-p_loop[i][j])*f[i][j] = p_left[i][j](f[i][j+1] + p_down[i][j]*f[i+1][j]
ある人はR*C(2<=R,C<=1000)の迷宮に閉じ込められ、最初は(1,1)という点で迷宮の出口は(R,C)だった.迷宮の各格子では、2つの魔法値を使って伝送路を開くことができます.彼が(x,y)という格子の中で、伝送路を開いた後、p_lift[i][j]の確率が送られ(x,y+1)、p_down[i][j]の確率が送られ(x+1,y)、p_がありますloop[i][j]の確率が送られる(x,y).彼に出口までかかる魔法の値の期待を聞いた.
典型的な自己から自己への移行は,式を解く必要がある.
令:f[i][j]は、(i,j)という点から出口(R,C)までかかる魔法値の期待を表す.では、次のようにします.
f[i][j] = p_loop[i][j]*f[i][j] + p_left[i][j]*f[i][j+1] + p_down[i][j]*f[i+1][j]移項可得:
(1-p_loop[i][j])*f[i][j] = p_left[i][j](f[i][j+1] + p_down[i][j]*f[i+1][j]
const int maxn = 1008 ;
double dp[maxn][maxn] ;
double p[maxn][maxn][4] ;
const double eps = 1e-7 ;
int main(){
int i , j , n , m , u , v ;
while(cin>>n>>m){
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= m ; j++){
scanf("%lf%lf%lf" ,&p[i][j][1] ,&p[i][j][2] ,&p[i][j][3]) ;
}
}
memset(dp , 0 , sizeof(dp)) ;
for(i = n ; i >= 1 ; i--){
for(j = m ; j >= 1 ; j--){
if(i == n && j == m) continue ;
if(fabs(1.0 - p[i][j][1]) < eps) continue ;
dp[i][j] = (2.0 + p[i][j][2] * dp[i][j+1]+ p[i][j][3] * dp[i+1][j])
/ (1.0 - p[i][j][1]) ;
}
}
printf("%.3lf
" , dp[1][1]) ;
}
return 0 ;
}