前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CodeForces 24D Broken robot (概率DP)

CodeForces 24D Broken robot (概率DP)

作者头像
ShenduCC
发布2018-04-27 10:42:43
6130
发布2018-04-27 10:42:43
举报
文章被收录于专栏:算法修养

D. Broken robot

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You received as a gift a very clever robot walking on a rectangular board. Unfortunately, you understood that it is broken and behaves rather strangely (randomly). The board consists of N rows and Mcolumns of cells. The robot is initially at some cell on the i-th row and the j-th column. Then at every step the robot could go to some another cell. The aim is to go to the bottommost (N-th) row. The robot can stay at it's current cell, move to the left, move to the right, or move to the cell below the current. If the robot is in the leftmost column it cannot move to the left, and if it is in the rightmost column it cannot move to the right. At every step all possible moves are equally probable. Return the expected number of step to reach the bottommost row.

Input

On the first line you will be given two space separated integers N andM (1 ≤ N, M ≤ 1000). On the second line you will be given another two space separated integers i and j (1 ≤ i ≤ N, 1 ≤ j ≤ M) — the number of the initial row and the number of the initial column. Note that, (1, 1) is the upper left corner of the board and (N, M) is the bottom right corner.

Output

Output the expected number of steps on a line of itself with at least 4digits after the decimal point.

Examples

input

代码语言:javascript
复制
10 10
10 4

output

代码语言:javascript
复制
0.0000000000

input

代码语言:javascript
复制
10 14
5 14

output

代码语言:javascript
复制
18.0038068653

概率DP

代码语言:javascript
复制
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <stdio.h>
#include <vector>

using namespace std;
int n,m;
int x,y;
double dp[1005][1005];
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%d%d",&x,&y);
    double p1=1.0/3;
    double p2=1.0/4;
    double p3=1.0/2;
    for(int i=n-1;i>=x;i--)
    {
        for(int t=0;t<=50;t++)
        {
            for(int j=1;j<=m;j++)
            {
                if(m==1)
                    dp[i][j]=(dp[i+1][j]*p3+1)/(1-p3);
                else if(j==1)
                    dp[i][j]=(dp[i][j+1]*p1+dp[i+1][j]*p1+1)/(1-p1);
                else if(j==m)
                    dp[i][j]=(dp[i][j-1]*p1+dp[i+1][j]*p1+1)/(1-p1);
                else
                    dp[i][j]=(dp[i][j+1]*p2+dp[i][j-1]*p2+dp[i+1][j]*p2+1)/(1-p2);
            }
        }
    }
    printf("%.6f\n",dp[x][y]);
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档