[hdu 3853] LOOPS
来源:互联网 发布:stm32官方烧录软件 编辑:程序博客网 时间:2024/05/16 13:42
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853
类型:期望dp
大意:有一个迷宫,你的位置是[1][1],迷宫的出口是[r][c],即右下角。每个格子上写了三个数字,意味停在原地的概率、向右走的概率和向下走的概率。每走一格的消耗是2,问要从[1][1]走到[r][c]的期望消耗是多少。
题解:设dp[i][j]为从[1][1]到[i][j]的期望消耗,mp[i][j][0]~mp[i][j][2]为停、右、下三种概率。那么转移方程可以这样写:
右式中也有dp[i][j],所以把方程转化一下:dp[i][j] = dp[i][j]*mp[i][j][0] + dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2];
注意到一个地方:dp[i][j] = (dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2] + 2) / (1 - mp[i][j][0]);
(1 - mp[i][j][0]);要注意mp[i][j][0]为1的情况。假设为1,意味走到这里的话,一定就停下了。所以期望是0。
根据方程就能倒推了。
代码:
#include<iostream>
#include<cmath>
using namespace std;
#define MAXN 1010
#define eps 1e-8
double dp[MAXN][MAXN];
double mp[MAXN][MAXN][3];
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
for(int k = 0; k < 3; k++)
{
scanf("%lf", &mp[i][j][k]);
}
}
}
memset(dp, 0, sizeof(dp));
for(int i = n; i > 0; i--)
{
for(int j = m; j > 0; j--)
{
if(i == n && j == m)continue;
if(fabs(1 - mp[i][j][0]) < eps)continue;
dp[i][j] = (dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2] + 2) / (1 - mp[i][j][0]);
};
}
printf("%.3lf\n", dp[1][1]);
}
}
- hdu 3853 LOOPS
- hdu 3853 LOOPS
- HDU 3853 LOOPS
- hdu 3853 LOOPS
- hdu 3853 LOOPS
- hdu 3853 LOOPS
- [hdu 3853] LOOPS
- hdu 3853 LOOPS(期望)
- hdu 3853 LOOPS DP
- HDU 3853 — LOOPS
- HDU 3853 LOOPS
- HDU 3853 LOOPS
- hdu 3853 LOOPS
- HDU 3853 LOOPS
- HDU 3853 LOOPS
- hdu 3853 LOOPS
- HDU 3853 LOOPS
- hdu 3853 LOOPS 概率dp
- 各进制转化
- 让PLSQL记住曾经登录过的用户名和密码,实现自动登录
- 十进制转各进制
- 十道海量数据处理面试题与十个方法大总结
- 破解常用断点设置-- 收集的精华
- [hdu 3853] LOOPS
- [nbut 1086]Miku调教
- [noj 1083] 数数塔
- Git使用基础篇
- [hrbust 2026] 势力较量
- 2014年02月28日
- NOJ1093[HTML]
- CSS背景半透明效果
- NOJ1091