概率DP,从前往后递推就可以了!!
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 using namespace std; 9 double dp[2][202],ans; 10 int main(){ 11 int n,m,t,i,j,k,l,r,w; 12 while(cin>>n>>m>>l>>r){ 13 if(n==0&&m==0&&l==0&&r==0) break; 14 memset(dp,0,sizeof(dp)); 15 dp[0][0]=1; 16 for(i=1,t=0;i<=m;i++){ 17 scanf("%d",&w); 18 w%=n; 19 k=t^1; 20 for(j=0;j<n;j++) dp[k][j]=0; 21 for(j=0;j<n;j++){ 22 if(!dp[t][j]) continue; 23 dp[k][(n-w+j)%n]+=0.5*dp[t][j]; 24 dp[k][(j+w)%n]+=0.5*dp[t][j]; 25 } 26 t=k; 27 } 28 ans=0; 29 for(i=l;i<=r;i++) 30 ans+=dp[t][i-1]; 31 printf("%.4lf ",ans); 32 } 33 return 0; 34 }