這題還算比較簡單的,不過有個位置有個小坑需要注意,不然狂wa不止
hdu3853傳送門
乙個r*c的迷宮,你一開始在左上角[1,1]處,出口在右下角[r,c]處。
你可以進行移動操作,每一次操作將會消耗2魔法值。每一次操作你都有機率向下,向右移動,或者停留在原地。問走出迷宮期望消耗的魔法值。
多組資料,eof結束
對於每一組資料:
第一行r , c表示r行c列矩陣
接下來r行每行c個實數三元組[a,b,c],分別表示在該位置進行移動時,呆在原地,向右移動,向下移動的概率。
每組資料輸出一行乙個實數(保留三位小數),表示答案。
input確實是乙個很簡單的期望dp。2 2
0.00 0.50 0.50 0.50 0.00 0.50
0.50 0.50 0.00 1.00 0.00 0.00
output
6.000
由:期望=概率*權值
有:當前狀態期望=子狀態1概率 * 子狀態1期望+子狀態2概率 * 子狀態2期望 + ······
設mag[i][j]表示從[i,j]走到[r,c]的期望消耗魔法值,很明顯mag[r][c]為0,用這個倒推,得到其他點的期望計算公式(也就是狀態轉移方程): ma
g[i]
[j]=
(mag
[i][
j]∗s
tay[
i][j
]+ma
g[i]
[j+1
]∗ri
ght[
i][j
]+ma
g[i+
1][j
]∗do
wn[i
][j]
+2)
移項得: ma
g[i]
[j]=
(mag
[i][
j+1]
∗rig
ht[i
][j]
+mag
[i+1
][j]
∗dow
n[i]
[j]+
2)/(
1−st
ay[i
][j]
) 注意,當stay[i][j]=1時,這個mag[i][j]的計算式是無效的,因為它根本到不了[r,c]點,因此對於這種情況,根據定義直接mag[i][j]=0就好了
完了直接倒著推就好了=w=
#include
#include
#include
using namespace std ;
int r , c ;
double dw[1005][1005] , rg[1005][1005] , sy[1005][1005] ;
double mag[1005][1005] ;
int main()
}printf( "%.3f\n" , mag[1][1] ) ;
}}
HDU 3853LOOPS 簡單概率DP
hdu 3853 loops 題目大意是說人現在在1,1,需要走到n,n,每次有p1的可能在元位置不變,p2的可能走到右邊一格,有p3的可能走到下面一格,問從起點走到終點的期望值 這是弱菜做的第一道概率dp的題,首先是看了一下有關概率dp的資料,大概知道一般球概率就是從起點推到終點,求期望就是從終點...
簡單概率dp 期望 hdu 3853 LOOPS
題目大意 給乙個r c的矩陣,每個格仔 x,y 用2魔法值就可以走一步,可以到 x,y x 1,y x,y 1 告訴每個格仔的能到達的三個位置的概率,求從左上角到達右下角所需魔法值的期望。解題思路 簡單期望dp.dp i j 表示從位置 i,j 到達終點的期望,則dp i j 2 dp i j sa...
hdu 3853 LOOPS(不錯的入門經典)
題意 給出乙個r c的迷宮,每個格仔可以走到 r,c r 1,c r,c 1 概率分別為p1 p2 p3 沒走一次消耗2各單位的能量,問從 1,1 走到 r,c 的平均能量 解析 設dp i j 表示 i,j 到 r,c 需要消耗的能量 則 dp i j p1 i j dp i j p2 i j d...