hdu3853-LOOPS

接触的第一道概率dp,这个题和以前做的唯一区别就是加了一个概率,但是也是参照了别人的思路做出来的。

dp[i][j]表示在第i,j格子所期望的。p[i][j][0], p[i][j][1], p[i][j][2]分别表示三种传送的概率。

dp[i][j] = p[i][j][0] * dp[i][j] + p[i][j][1] * dp[i][j + 1]  + p[i][j][2] * dp[i + 1][j] + 2;

可以推出来 dp[i][j] = ( p[i][j][1] * dp[i][j - 1] + p[i][j][2] * dp[i + 1][j] + 2 ) / 1 - p[i][j][0];

这样就是倒退的过程了,要求dp[i + 1][j] 和 dp[i][j + 1] 就可以求 dp[i][j]。

/*************************************************************************> File Name: hdoj3853.cpp> Author: AcToy> Mail: ycsgldy@163.com > Created Time: 2013年07月17日 星期三 09时19分05秒************************************************************************/#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include using namespace std;
typedef unsigned int u32;
typedef long long i64;
typedef unsigned long long u64;
typedef vector IV;
typedef vector BV;
typedef pair II;
typedef vector IIV;
#define For(t,v,c) for(t::const_iterator v=c.begin(); v!=c.end(); ++v)
const int INF = 0x7FFFFFFF;
const double eps = 1E-10;
const double PI = acos(-1);
const int maxn = 1010;
double dp[maxn][maxn], p[maxn][maxn][3];
int r, c;int main()
{while(scanf("%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)scanf("%lf", &p[i][j][k]);dp[r][c] = 0;p[r][c][0] = 1;for(int i = r; i >= 1; --i)for(int j = c; j >= 1; --j)for(int k = 0; k < 3; ++k) {if(p[i][j][0] == 1) continue;double tmp = 1 / (1 - p[i][j][0]);dp[i][j] = (p[i][j][1] * dp[i][j + 1] + p[i][j][2] * dp[i + 1][j] + 2) * tmp;}printf("%.3lf\n", dp[1][1]);}return 0;
}



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部