算是入門的第二題了。
魔法師在迷宮中分別有p_loop的概率停留,p_right的概率走到(i,j+1),p_down的概率走到(i+1,j),每走一次消耗2點魔法值。
dp[i][j]表示從當前走到(r,c)所需要的魔法值,則有:dp[i][j]=dp[i][j]*p_loop[i][j]+dp[i][j+1]*p_right[i][j]+dp[i][j+1]*p_down[i][j]+2;
移項化簡後有:dp[i][j]=dp[i][j+1]*p_right[i][j]/(1-p_loop[i][j])+dp[i+1][j]*p_down[i][j]/(1-p_loop[i][j])+2/(1-p_loop[i][j]);
因為分母不能為零,所以要保證(1-p_loop[i][j])不為零。
#include#include#include#include#include#include#include#include#include#define mm(a,b) memset(a,b,sizeof(a))
#define maxn 1010
using namespace std;
const int inf=0x7ffffff;
const double pi=acos(-1.0);
const double eps=1e-8;
const double e=2.7182818284590452354;
double dp[maxn][maxn];
double p_loop[maxn][maxn];
double p_right[maxn][maxn];
double p_down[maxn][maxn];
int main()
{ int r,c;
while(~scanf("%d%d",&r,&c))
{ mm(dp,0);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
scanf("%lf%lf%lf",&p_loop[i][j],&p_right[i][j],&p_down[i][j]);
dp[r][c]=0;
for(int i=r;i>=1;i--)
for(int j=c;j>=1;j--)
{if(i==r && j==c) continue;
if((1-p_loop[i][j])
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...
HDU3853 LOOPS 概率DP數學期望
題目大意 給出乙個n m的矩陣,要求從左上角走到右下角,每次移動消耗兩點能量,並且每次的移動方向是有概率的 回到自身,往右或者往下 輸入的矩陣中的每個位置有三個數,分別表示回到自身 向右移動 向下移動的概率,三者概率和為1,要求輸出從左上角走到右下角需要消耗的能量值的期望。測試資料可能有點問題,會出...