HDU 3853 LOOPS 期望dp
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3853
LOOPS
Memory Limit: 125536/65536 K (Java/Others)
输入
The first line contains two integers R and C (2 <= R, C <= 1000).
The following R lines, each contains C*3 real numbers, at 2 decimal places. Every three numbers make a group. The first, second and third number of the cth group of line r represent the probability of transportation to grid (r, c), grid (r, c+1), grid (r+1, c) of the portal in grid (r, c) respectively. Two groups of numbers are separated by 4 spaces.
It is ensured that the sum of three numbers in each group is 1, and the second numbers of the rightmost groups are 0 (as there are no grids on the right of them) while the third numbers of the downmost groups are 0 (as there are no grids below them).
You may ignore the last three numbers of the input data. They are printed just for looking neat.
The answer is ensured no greater than 1000000.
Terminal at EOF
输出
A real number at 3 decimal places (round to), representing the expect magic power Homura need to escape from the LOOPS.
样例输入
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
样例输出
6.000
题意
给你一个R*C的地图,你要从(1,1)走到(R,C),每次你可以选择留原地,或向下走一格,或向右走一格,问最后的
题解
和poj 2096一个意思。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef vector<intVI;
typedef pair<int,intPII;
typedef vector<pair<int,intVPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=1010;
int R,C;
double pro[maxn][maxn][3];
double dp[maxn][maxn];
int main() {
while(scf("%d%d",&R,&C)==2){
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
for(int k=0;k<3;k++){
scf("%lf",&pro[i][j][k]);
}
}
}
for(int i=R;i>=1;i--){
for(int j=C;j>=1;j--){
if(i==R&&j==C){
dp[i][j]=0.0;
}else{
double p0=pro[i][j][0];
double p1=pro[i][j][1];
double p2=pro[i][j][2];
///注意有些点是黑洞,跳不出去的!
if(fabs(1-p0)<eps) continue;
dp[i][j]=(p1*dp[i][j+1]+p2*dp[i+1][j]+2)/(1-p0);
}
}
}
prf("%.3f\n",dp[1][1]);
}
return 0;
}
//end-----------------------------------------------------------------------