zoukankan      html  css  js  c++  java
  • HDU3853

    Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl).

    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 exit grid. It costs Homura 2 magic power to use a portal once. The portal in a grid G(r, c) will send Homura to the grid below G (grid(r+1, c)), the grid on the right of G (grid(r, c+1)), or even G itself at respective probability (How evil the Boss Incubator is)!
    At the beginning Homura is in the top left corner of the LOOPS ((1, 1)), and the exit of the labyrinth is in the bottom right corner ((R, C)). Given the probability of transmissions of each portal, your task is help poor Homura calculate the EXPECT magic power she need to escape from the LOOPS.

    裸的期望DP

    dp[i[j]表示当前在i,j位置,到达终点的期望

    我们不难看出转移方程为

    $dp[i][j]=dp[i][j]*p0+dp[i][j+1]*p1+dp[i+1][j]*p2$

    解这个式子有两种方法

    1.高斯消元

    2.把右边的$dp[i][j]$除到左边

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 using namespace std;
     7 const int MAXN=2001;
     8 const int INF=0x7fffff;
     9 double dp[MAXN][MAXN];//走到i,j的期望 
    10 struct node
    11 {
    12     double a,b,c;
    13     void clear(){a=b=c=0.0;}
    14 }map[MAXN][MAXN];
    15 int n,m;
    16 const double eps=1e-5;
    17 int main()
    18 {
    19     dp[n][m]=0;
    20     while(scanf("%d%d",&n,&m)!=EOF)
    21     {
    22         memset(dp,0.00,sizeof(dp));
    23         dp[n][m]=0;
    24         for(int i=1;i<=n;i++)
    25             for(int j=1;j<=m;j++)
    26                 map[i][j].clear();
    27         for(int i=1;i<=n;i++)
    28             for(int j=1;j<=m;j++)
    29                 scanf("%lf%lf%lf",&map[i][j].a,&map[i][j].b,&map[i][j].c);
    30         for(int i=n;i>=1;i--)
    31             for(int j=m;j>=1;j--)
    32             {
    33                 if(i==n&&j==m)    continue;
    34                 if(fabs(1.00-map[i][j].a)<eps)    continue;
    35                 dp[i][j]=(map[i][j].b*dp[i][j+1]+map[i][j].c*dp[i+1][j]+2.00)/(1.0-map[i][j].a);
    36             }    
    37         printf("%.3lf
    ",dp[1][1]);
    38     }
    39     
    40     
    41     return 0;
    42 }
  • 相关阅读:
    H5 移动端相册拍照 录音 录像,然后上传后台
    h5 移动端调用相机 摄像机 录音机获取文件,并下载到本地
    Java 判断字符串是否含有 数字 字母 特殊字符
    java 以0开头的数字计算,保留开头0
    Spring 与hibernate 整合,测试数据连接
    http://blog.csdn.net/basycia/article/details/52205916
    MySQL数据库基础知识002
    数据库基础知识001
    数组排序
    输出杨辉三角
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7786984.html
Copyright © 2011-2022 走看看