hdu 4576(概率dp)

来源:互联网 发布:java和数据挖掘 编辑:程序博客网 时间:2024/06/12 22:07

传送门
题解:正退,每次走到某一位置的值为,从它两边走过来的概率之和/2。必须要开滚动数组。
这题既卡空间又卡常数是什么心态(╯‵□′)╯︵┻━┻ ㄟ( ▔, ▔ )ㄏ

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;double dp[2][208];int n,m,l,r;inline int read() {    int x=0;char c=getchar();    while (c<'0'||c>'9') c=getchar();    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x;}int main() {//  freopen("hdu 4576.in","r",stdin);    while (n=read(),m=read(),l=read(),r=read()) {        if (!(n||m||l||r)) break;        memset(dp[0],0,sizeof(dp[0]));        dp[0][0]=1;        int cur=1;        for (register int k=0;k<m;++k) {            int t=read();            for (int i=0;i<n;++i)                dp[cur][i]=0.5*dp[cur^1][(i-t+n)%n]+0.5*dp[cur^1][(i+t)%n];            cur^=1;        }        double ans=0;        for (int i=l-1;i<r;++i)            ans+=dp[cur^1][i];        printf("%.4lf\n",ans);    }    return 0;}
原创粉丝点击