HDU 4050 wolf5x

Problem Description

There are n grids in a row. The coordinates of grids are numbered from x=1 to x=n. Someone starts from x=0. You can step forward with your left leg or right leg alternatively in turn.Namely,if you step forward with your left leg, then you must step with your right leg next. As you can not jump , only one leg is allowed to use each step. Every step you take is in the range of [A,B], inclusively; namely, every step you take is at most B units and at least A units.
Before you start to move, the grids will be initialized randomly with 4 states(0,1,2,3), and p[i][j] means the probability of ith grid initialized with state j. After initialization, the state of the grids will not change.

State 0 means you can't step into the correspoding grid.
State 1 means you can just step into the grid with your left leg. 
State 2 means you can just step into the grid with your right leg.
State 3 means you can step into the grid with either of your legs,and the next step,you can use any legs; namely you don't need to follow the rules above.
If x>n, then the grid can be stepped in with arbitrary method.means you can step at the place after the nth grid.
For every step,you will choose the “step method” with the minimum step length. Namely, if you can take the step of S units and S+1 units, you will choose the step of S units.
Until you can't step in any grids in front of you,or you have been in a grid x>n, you will stop.
Can you calculate the expectation of the steps when you stop? 

Input

An integer T means the number of cases.T<=30
For each case,the first line is three integers n,A,B.
The next n lines,each line has 4 number p[i][0], p[i][1], p[i][2], p[i][3].
1 <= A <= B <= n<= 2000.
0 <= p[i][j] <= 1, p[i][0]+p[i][1]+p[i][2]+p[i][3] = 1.

Output

The expectation of the steps when you stop
you can assume that the relative epsilon is no more than 1e-6

Sample Input

9
2 1 1
0 0.5 0.5 0
0 0 1 0
2 1 1
0 0.5 0.5 0
0.5 0.5 0 0
2 1 2
0 0.5 0.5 0
0 0 1 0
2 1 2
0.2 0.3 0.4 0.1
0.15 0.2 0.25 0.4
3 1 10
0 0 0 1
0 0 0 1
0 0 0 1
3 1 1
0 0 0 1
0 0 0 1
0 0 0 1
3 2 2
0 0 0 1
0 0 0 1
0 0 0 1
3 3 3
0 0 0 1
0 0 0 1
0 0 0 1
3 1 2
0.0 0.3 0.6 0.1
0.1 0.2 0.3 0.4
0.5 0.4 0.1 0.0

Sample Output

2.00000000
1.50000000
2.50000000
2.46000000
4.00000000
4.00000000
2.00000000
2.00000000

2.80200000

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5510;
int T,n,l,r;
double p[maxn][4],f[maxn][4];

int main()
{
    cin>>T;
    while (T--)
    {
        cin>>n>>l>>r;
        memset(p,0,sizeof(p));
        memset(f,0,sizeof(f));
        for (int i=1;i<=n;i++) 
            for (int j=0;j<4;j++) scanf("%lf",&p[i][j]);
        for (int i=n+1;i<=n+r;i++) p[i][3]=1;
        f[0][3]=1;
        for (int i=0;i<=n;i++)
        {
            double P1,P2,P3;
            P1=P2=P3=1;
            for (int k=l;k<=r;k++)
            {
                f[i+k][2]+=P1*f[i][1]*p[i+k][2];
                f[i+k][3]+=P1*f[i][1]*p[i+k][3];
                P1*=p[i+k][1]+p[i+k][0];

                f[i+k][1]+=P2*f[i][2]*p[i+k][1];
                f[i+k][3]+=P2*f[i][2]*p[i+k][3];
                P2*=p[i+k][2]+p[i+k][0];

                f[i+k][1]+=P3*f[i][3]*p[i+k][1];
                f[i+k][2]+=P3*f[i][3]*p[i+k][2];
                f[i+k][3]+=P3*f[i][3]*p[i+k][3];
                P3*=p[i+k][0];
            }
        }
        double ans=0;
        for (int i=1;i<=n+r;i++)
            for (int j=1;j<=4;j++) ans+=f[i][j];
        printf("%.8lf\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值