题意
1到n形成一个环,机器人从一号点出发,给定每次走的长度,方向随机,问最后在某个区域内的概率是多少。
思路
入门级概率dp
把
if(dp[id][i])
这段去掉就超时了,还是得剪枝一下
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
double dp[2][maxn];
int main(){
int n,m,l,r;
while(~scanf("%d%d%d%d",&n,&m,&l,&r)){
if(n==0&&m==0&&l==0&&r==0) break;
for(int i=0;i<=n;i++)
dp[0][i]=dp[1][i]=0;
dp[0][0]=1;
int id=0;
for(int i=1;i<=m;i++){
int x;scanf("%d",&x);
// for(int i=0;i<n;i++) {
// printf("%lf ",dp[id][i]);
// }puts("");
for(int i=0;i<n;i++){
dp[id^1][i]=0;
}
for(int i=0;i<n;i++){
if(dp[id][i]){
dp[id^1][(i+x)%n]+=0.5*dp[id][i];
dp[id^1][(i-x+n)%n]+=dp[id][i]*0.5;
}
}
id^=1;
// for(int i=0;i<n;i++) {
// printf("%lf ",dp[id][i]);
// }puts("");
}
double ans=0;
for(int i=l-1;i<r;i++){
ans+=dp[id][i];
}
printf("%.4lf\n",ans);
}
}