睡前小dp-hdu3853-概率dp

http://acm.hdu.edu.cn/showproblem.php?pid=3853

膜猴烧酒madoka

讲定义为dp[i][j] 位置为ij的魔法值期望,可以发现dp[i][j] = dp[i][j]*p1[i][j]+dp[i][j+1]*p2[i][j]+dp[i+1][j]*p3[i][j]+2

最后可以表示为

dp[x][y] = 1.0/(1-p[x][y][0])*(p[x][y][1]*dp[x][y+1]+p[x][y][2]*dp[x+1][y]+2.0);

递推的时候从右下角开始,向左上角递推。

有一个坑是p1=1 时,会出错,所以要特判一下。直接跳过。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int R,C;
double dp[1010][1010],p[1010][1010][3];

int main()
{
    while(~scanf("%d%d",&R,&C))
    {
        for(int i=1;i<=R;i++)
        {
            for(int j=1;j<=C;j++)
            {
                scanf("%lf%lf%lf",&p[i][j][0],&p[i][j][1],&p[i][j][2]);
            }
        }

        memset(dp,0,sizeof dp);

        for(int x=R;x>=1;x--)
        {
            for(int y=C;y>=1;y--)
            {
                if(x==R&&y==C) continue;
                if(abs(p[x][y][0]-1.0)<(1e-7)) continue;
                dp[x][y] = 1.0/(1-p[x][y][0])*(p[x][y][1]*dp[x][y+1]+p[x][y][2]*dp[x+1][y]+2.0);
            }
        }

    /*
            for(int i=1;i<=R;i++)
        {
            for(int j=1;j<=C;j++)
            {
                printf("%lf ",dp[i][j]);
            }
            printf("\n");
        }
    */
        printf("%.3lf\n",dp[1][1]);
    }
}
时间: 2024-12-22 22:09:00

睡前小dp-hdu3853-概率dp的相关文章

睡前小dp-poj3254-状压dp入门

http://poj.org/problem?id=3254 从这里学的 http://blog.csdn.net/accry/article/details/6607703 状压dp的入门题.一片N×M的田地,有的地方可以种玉米,有的地方不可以.种玉米的区块不能相邻.种玉米的求总方案数,不种玉米也是一种方案. 每一行总共2^N种状态,其中删去有相邻的状态,删除不符合给定条件的状态.保留下最终的所有状态.然后开始dp. 从上往下,每一行之依赖于上一行.所以从上一行转移过去,把状态数加起来就行了.

HDU3853 概率DP

LOOPS Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in a labyrinth called LOOPS. The planform of the LOOPS is a rectangle of R*C grids. There is a portal in each grid except the e

【BZOJ 3652】大新闻 数位dp+期望概率dp

并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的匹配(就是异或后为二进制最高位与n-1相等的最大数)并且算出其异或后的总和,然后我们按位贪心,带着所有的数(一开始我们假设所有的数是小于等于二进制最高位与n-1相等的最大数的所有数)从高位走向低位,每走一步,如果这一位是0,就会导致一半的数在这一位不能是1,减去这一半的数在这一位上的贡献,如果这一位

睡前小dp-codeforce414B-dp+一点点想法

http://codeforces.com/problemset/problem/414/B 定义一个串为好的串当这个串符合 di|di+1,1<i<k-1 给定一个n为串中元素的取值范围,一个k为串的长度,计算串的所有可能的计数. 我一开始想到了用dp[i][j] i表示串的长度,j表示长度为i结尾为j的串的数目. 但是怎么递推我想歪了.我想的是从i-1推出所有的i,这样每次递推都有n^2的复杂度. 看了题解才明白是每次用i把i+1推出来. #include <cstdio> #

hdu3853之概率dp入门

LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Submission(s): 1651    Accepted Submission(s): 653 Problem Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wants to help h

hdu3853(概率dp)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有一个人被困在一个 R*C(2<=R,C<=1000) 的迷宫中,起初他在 (1,1) 这个点,迷宫的出口是 (R,C).在迷宫的每一个格子中,他能花费 2 个魔法值开启传送通道.假设他在 (x,y) 这个格子中,开启传送通道之后,有 p_lift[i][j] 的概率被送到 (x,y+1),有 p_down[i][j] 的概率被送到 (x+1,y),有 p_loop[i][j] 的概率

HDU3853 LOOPS 概率DP

十多分钟做出来了呃,虽然是入门级别的题目,但是还算是比较开心了呵呵 题意: 从一张r*c的图中 由左上角走向右下角,每一步 有一定概率不动,也有一定概率往下,还有一定概率向由走一步,每一次花费2 方程: 是最一般的思路,以目标状态为边界,当前状态到目标状态所需期望  为方程 dp[i][j]  代表在(i,j)到目标 需要的期望 那么很显然dp[i][j] = dp[i + 1][j] * mp[i][j][1] + dp[i][j + 1] * mp[i][j][0] + dp[i][j] *

2014 Super Training #1 F Passage 概率DP

原题: HDU 3366   http://acm.hdu.edu.cn/showproblem.php?pid=3366 本来用贪心去做,怎么都WA,后来看网上原来是一个DP题. 首先按P/Q来做排序,即P越大,Q越小就越好,这样可以确保先选最优的路走. dp[i][j]表示已经到了第i条路(说明前i-1条都没成功的情况),还剩j块钱时能够走出去的概率. 则方程: dp[i][j] = way[i].P + way[i].Q*(dp[i+1][j-1]) + way[i].D*(dp[i+1]

hdu4815 (概率DP)

由于没有专门练过概率DP , 场上硬推的,由于一点小失误WA了两发 . 我们很容易求出来d[i][j],表示前i道题,得分为j的概率 . 这样,最终打完所有题目之后猴子得任意分数的概率我们就知道了,老虎要想赢就要至少得和他一样的分数,那么就很好办了,从0~max分,不断相加概率,当概率大于P时的分数就是答案 . 细节见代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5