一道入门概率dp: http://acm.hdu.edu.cn/showproblem.php?pid=4576
分析:为了方便取模,把环的范围设置为0到n-1。使用滚动数组节省空间,因为可能多次操作的w相同所以第一维不可省略。第一维大小设置为2即可。这题学了一个用异或简化代码
转移方程:f[now^1][i]=0.5*f[now][(i+w)%n]+0.5*f[now][(i-w+n)%n]; (now为现在所在状态,now^1为要计算的状态)
分析:为了方便取模,把环的范围设置为0到n-1。使用滚动数组节省空间,因为可能多次操作的w相同所以第一维不可省略。第一维大小设置为2即可。这题学了一个用异或简化代码
转移方程:f[now^1][i]=0.5*f[now][(i+w)%n]+0.5*f[now][(i-w+n)%n]; (now为现在所在状态,now^1为要计算的状态)
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 203; double f[2][maxn]; int main() { int n,l,r,m; while(~scanf("%d%d%d%d",&n,&m,&l,&r)) { if(n==0&&m==0&&l==0&&r==0) break; int now=0; f[0][0]=1; for(int i=1;i<n;i++) f[0][i]=0; while(m--) { int w; scanf("%d",&w); for(int i=0;i<n;i++) f[now^1][i]=0.5*f[now][(i+w+n)%n]+0.5*f[now][(i-w+n)%n]; now^=1; } double ans=0.0; for(int i=l-1;i<r;i++) ans+=f[now][i]; printf("%.4lf\n",ans); } return 0; }