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