其他分享
首页 > 其他分享> > hdu 4576 概率dp

hdu 4576 概率dp

作者:互联网

Michael has a telecontrol robot. One day he put the robot on a loop with n cells. The cells are numbered from 1 to n clockwise. 
 



At first the robot is in cell 1. Then Michael uses a remote control to send m commands to the robot. A command will make the robot walk some distance. Unfortunately the direction part on the remote control is broken, so for every command the robot will chose a direction(clockwise or anticlockwise) randomly with equal possibility, and then walk w cells forward. 
Michael wants to know the possibility of the robot stopping in the cell that cell number >= l and <= r after m commands. 

 

Input

There are multiple test cases. 
Each test case contains several lines. 
The first line contains four integers: above mentioned n(1≤n≤200) ,m(0≤m≤1,000,000),l,r(1≤l≤r≤n). 
Then m lines follow, each representing a command. A command is a integer w(1≤w≤100) representing the cell length the robot will walk for this command.   
The input end with n=0,m=0,l=0,r=0. You should not process this test case. 

 

Output

For each test case in the input, you should output a line with the expected possibility. Output should be round to 4 digits after decimal points.

 

Sample Input


 

3 1 1 2 1 5 2 4 4 1 2 0 0 0 0

 

Sample Output


 

0.5000 0.2500

 

 每个点都会顺时针,逆时针的走,所以概率会一分为二。 如:初始的1点概率为1,走一步 那么 n点和2点的概率都为1/2

用dp[i][j]来表示在第i步时点j的概率是多少. 由于每个点的概率只与上一次的状态有关,我们只需要两行就够了.

 

#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#define  LL long long
#define  ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#define maxn 1000005
using namespace std;
double dp[2][205];
int n,m;
int main()
{
    int l,r;
    while(~scanf("%d%d%d%d",&n,&m,&l,&r) &&(n + m + l + r)){
      mem(dp,0);
      dp[0][1] = 1.0;
      int cur = 0;
      while(m--){
        int x;
        scanf("%d",&x);
        cur ^= 1;//下一个状态
        x = x % n;
        for(int i = 1; i <= n; i++){
          dp[cur][i] = dp[cur^1][i+x>n ? i+x-n : i+x] * 0.5 + dp[cur^1][i-x<1 ? i-x+n : i-x] * 0.5;//该状态等于上一状态的能到改点概率的和
        }

      }
      double ans = 0.0;
      for(int i = l; i <= r; i++){
        ans += dp[cur][i] * 1.0;
      }
      printf("%.4lf\n",ans);
    }


    return 0;

}

 

标签:hdu,int,robot,command,4576,include,dp,define
来源: https://blog.csdn.net/qq_40620465/article/details/99940480