LOOPS

LOOPS

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3853

DP

设dp[i][j]为(i,j)到终点期望的使用魔力值,mp[i][j][k]为(i,j)到三个方向的概率。

那么,dp[i][j]=(2+dp[i][j+1])*mp[i][j][1]+(2+dp[i+1][j])*mp[i][j][2]+(2+dp[i][j])*mp[i][j][0],

移向得,dp[i][j]*(1-mp[i][j][0])=(2+dp[i][j+1])*mp[i][j][1]+(2+dp[i+1][j])*mp[i][j][2]+2*mp[i][j][0],

化简得,dp[i][j]=(2+dp[i][j+1]*mp[i][j][1]+dp[i+1][j]*mp[i][j][2])/(1-mp[i][j][0]).

注意当mp[i][j][0]==1时,此时将陷入LOOPS.

代码如下:

 #include<cstdio>
#include<cstring>
#include<cmath>
#define EPS 1e-8
#define N 1005
#define INF 1000005
using namespace std;
int n,m;
double mp[N][N][];
double dp[N][N];
int main(void){
while(~scanf("%d%d",&n,&m)){
memset(dp,,sizeof(dp));
for(int i=;i<n;++i)
for(int j=;j<m;++j)
for(int k=;k<;++k)
scanf("%lf",&mp[i][j][k]);
for(int i=n-;i>=;--i)
for(int j=m-;j>=;--j){
if(i==n-&&j==m-)continue;
if(fabs(-mp[i][j][])<EPS)dp[i][j]=INF;
else dp[i][j]=(+dp[i][j+]*mp[i][j][]+dp[i+][j]*mp[i][j][])/(-mp[i][j][]);
}
printf("%.3lf\n",dp[][]);
}
}
上一篇:java中的几种实体类对象(PO,VO,DAO,BO,POJO)


下一篇:MVC Action Filter