dp题
没什么技术含量,照着题意推就行了,别想太复杂。
#include<stdio.h>
#include<iostream>
#include<memory.h>
using namespace std;
int n,m,l,r,w,f;
double dp[2][210],ans;
int main()
{
int ne[2];
while(1)
{
memset(dp,0,sizeof(dp));
scanf("%d%d%d%d",&n,&m,&l,&r);
if(n==0 && m==0 && l==0 && r==0)
break;
if(m==0)
{
if(l==1)
printf("1.0000\n");
else
printf("0.0000\n");
continue;
}
scanf("%d",&w);
f=0;
ne[0]=(1+w)%n;
ne[1]=(1-w)%n;
while(ne[0]<=0)
ne[0]+=n;
while(ne[1]<=0)
ne[1]+=n;
dp[f][ne[0]]+=0.5;//这里不写dp[f][ne[0]]=dp[f][ne[1]]=0.5
dp[f][ne[1]]+=0.5;//是因为往左和往右可能走到同一点
for(int k=2;k<=m;k++)
{
scanf("%d",&w);
for(int j=1;j<=n;j++)
{
ne[0]=(j+w)%n;
ne[1]=(j-w)%n;
while(ne[0]<=0)
ne[0]+=n;
while(ne[1]<=0)
ne[1]+=n;
dp[1-f][j]=(dp[f][ne[0]]+dp[f][ne[1]])/2;
}
f=1-f;
}
ans=0;
for(int i=l;i<=r;i++)
ans+=dp[f][i];
printf("%.4lf\n",ans);
}
return 0;
}