都市大飙车 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; }