一道入门概率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;
}

京公网安备 11010502036488号