HDU 4576 Robot(概率dp)

Robot

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)
Total Submission(s): 5906    Accepted Submission(s): 1754


Problem Description

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

分析

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 double f[2][210];
 8 // f[i][j]到第i次操作,位置j上的概率 
 9 
10 int main() {
11     
12     int n,m,l,r;
13     while (~scanf("%d%d%d%d",&n,&m,&l,&r) && n+m+l+r) {
14         memset(f,0,sizeof(f));
15         f[0][1] = 1.0;
16         int cur = 0;        
17         for (int w,i=1; i<=m; ++i) {
18             scanf("%d",&w);
19             w = w%n;
20             cur = cur^1;
21             for (int k=1; k<=n; ++k) {
22                 f[cur][k] = f[cur^1][k+w>n?k+w-n:k+w]/2.0 + f[cur^1][k-w<1?k-w+n:k-w]/2.0;
23             }
24         }
25         double ans = 0.0;
26         for (int i=l; i<=r; ++i) ans += f[cur][i];
27         printf("%.4lf
",ans);
28     }
29     return 0;    
30 }
原文地址:https://www.cnblogs.com/mjtcn/p/8582100.html