都市大飙车 UESTC 1652 概率DP

记录一个障碍数组,用滚动数组优化内存

因为当前维由上一维转化需要很多判断,所以我们就由当前维推导下一维,这就很好操作了

状态转移很好想,具体请看代码

一道很模板化的概率DP,水

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
template<class T> inline void read(T &_a){
    bool f=0;int _ch=getchar();_a=0;
    while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}
    while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}
    if(f)_a=-_a;
}

int n,m,k;
double dp[2][30001];
bool flag,zhangai[1001][30001];

int main()
{
    read(m); read(k); read(n);
    int p; read(p); dp[0][p]=1;
    for (register int i=1,a,b;i<=k;++i){read(a); read(b); zhangai[b][a]=true;}
    for (register int i=1;i<=n;++i)
    {
        bool nxt=flag^1;
        memset(dp[nxt],0,sizeof(dp[nxt]));
        for (register int v=1;v<=m;++v)
        {
            if(dp[flag][v]==0) continue;
            double tmp=1;
            if(v>1) tmp+=1;
            if(v<m) tmp+=1;
            double gl=1.000000/tmp;
            if(!zhangai[i][v])dp[nxt][v]+=dp[flag][v]*gl;
            if(v>1&&!zhangai[i][v-1]) dp[nxt][v-1]+=dp[flag][v]*gl;
            if(v<m&&!zhangai[i][v+1]) dp[nxt][v+1]+=dp[flag][v]*gl;
        }
        flag=nxt;
    }
    double ans=0;
    for (register int i=1;i<=m;++i) ans+=dp[flag][i];
    printf("%lf",ans);
    return 0;
}

 

posted @ 2017-11-04 15:42  JayWang  阅读(247)  评论(0编辑  收藏  举报