zoukankan      html  css  js  c++  java
  • 【HDU3853】LOOPS

    题意

      有一个R*C的方格。一个人想从(1,1)走到(r,c)。在每个格子都有三种选择,向下,向右,或者原地不动。每个格子里的每个选择都有一定的概率。而每次移动都需要消耗2点的能量,问期望消耗的能量是多少。

    分析

      概率DP入门题。

      f[i][j]为从(i,j)到(r,c)的期望消耗。从(i,j)有三种转移方法,在原地不动,向右,向下。在原地不动的概率是G[i][j][1],向右的概率为G[i][j][2],向下的概率为G[i][j][3]。但是在原地不动是不消耗能量的。(想一想如果在原地不动也消耗能量的话应该怎么解决)所以转移我们只考虑转移到右边和下边的情况。

     f[i][j]=(f[i+1][j]*G[i][j][2]+f[i][j+1]*G[i][j][3]+2)/(1-G[i][j][1]).

    code

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <cmath>
     6 
     7 using namespace std;
     8 const int maxn=1000+100;
     9 const int eps=1e-5;
    10 
    11 double G[maxn][maxn][5];
    12 double f[maxn][maxn];
    13 
    14 int r,c;
    15 int main(){
    16     while(scanf("%d%d",&r,&c)!=EOF&&r&&c){
    17         for(int i=1;i<=r;i++){
    18             for(int j=1;j<=c;j++){
    19                 for(int l=1;l<=3;l++){
    20                     scanf("%lf",&G[i][j][l]);
    21                 }
    22             }
    23         }
    24         memset(f,0,sizeof(f));
    25         for(int i=r;i>=1;i--){
    26             for(int j=c;j>=1;j--){
    27                 if(i==r&&j==c)
    28                     continue;
    29                 if(fabs(1-G[i][j][1])<=eps)continue;
    30                 f[i][j]=(f[i][j+1]*G[i][j][2]+f[i+1][j]*G[i][j][3]+2)/(1-G[i][j][1]);
    31             }
    32         }
    33 
    34         printf("%.3f
    ",f[1][1]);
    35     }
    36 return 0;
    37 }
    View Code
  • 相关阅读:
    size_t类型
    sudo 安装 ——Debian 6
    Ubuntu10.10 上海交大及其他教育网更新源
    Linux 命令解决小问题
    VMware Player tools for linux 安装
    内核总结之内存管理api (转)
    volatile的使用
    二叉树层次遍历队列实现
    Ubuntu 11.04 下OpenCV安装
    Ubuntu 添加教育网更新源【转】
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9087670.html
Copyright © 2011-2022 走看看