应该算是dp吧
只需要记录上一步各个位置上的概率,位置加上和减去w后的位置的概率是乘以原来位置的0.5加在一起
刚开始写的时候是robot[2][220],总是超时,改成robot[220][2]就好了
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
double robot[220][2];
int n,m,l,r;
while(cin>>n>>m>>l>>r)
{
if(n == 0 && m == 0 && l == 0 && r == 0)
break;
int p=0;
for(int i=0;i<n;i++)
{
robot[i][0]=0;
robot[i][1]=0;
}
int w,q;
robot[0][0]=1.0;
for(int i=0;i<m;i++)
{
scanf("%d",&w);
for(int j=0;j<n;j++)
{
robot[(j+w)%n][!(i&1)]+=robot[j][i&1]*0.5;
q=j-w;
while(q<0)
q+=n;
robot[q][!(i&1)]+=robot[j][i&1]*0.5;
robot[j][i&1]=0.0;
}
}
double sum=0.0;
for(int i=l-1;i<r;i++)
{
sum+=robot[i][m&1];
//sum+=robot[1-p][i];
}
printf("%.4lf\n", sum);
}
return 0;
}