(施工中……)
比赛传送门:https://www.jisuanke.com/contest/3004
D. Robots(期望dp)
题意
给一个DAG,保证入度为$0$的点只有$1$,出度为$0$的点只有$n$。
现在一个机器人从$1$出发,每天都会以相同的概率前往相邻节点之一或静止不动。
每天机器人消耗的耐久等于经过的天数。
求机器人到点$n$期望消耗的耐久。
划水划的很愉快,唯一一道做出来的题。但是和题解做法不同(感觉我的方法麻烦),因此砸了3h在这题上面(正在试图读懂题解ing)。
设$f[u][j]$表示第$j$天从点$u$出发到$n$期望消耗的耐久,$out[i]$表示$i$的出度$+1$,那么答案就是$f[1][1]$。
初始的方程就不写了很容易。
经过一大顿推导可以求出$f[u][j]=\frac{out[u]}{out[u]-1}\times j+\frac{out[u]}{(out[u]-1)^2}+\sum_v(\frac{f[v][j+1]}{out[u]}+\frac{f[v][j+2]}{out[u]^2}+...)$,其中$v$为$u$相邻节点。
后面那点奇葩的东西很难处理,不妨我们先思考对于$1->2$这样的一个图,$f[1][j]$是多少?
咦为什么这个东西是个等差数列?
于是我们假设$f[v][j]$也是一个等差数列,则原式子可以化为$f[u][j]=\frac{out[u]}{out[u]-1}\times j+\frac{out[u]}{(out[u]-1)^2}+\sum_v \frac{f[v][j+1]*out[u]-f[v][j]}{(out[u]-1)^2}$,总之你能求出$f[u][j]$也是个等差数列就是了。
于是数学归纳法可以求出所有的$f[u][j]$都是等差数列,因此我们$j$只需要求$1$和$2$,然后从后往前求即可,复杂度$O(n+m)$,细节和具体实现看代码。
#include<cmath> #include<stack> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; typedef long double dl; const int N=1e5+5; const int M=2e5+5; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch==‘-‘;ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } struct node{ int to,nxt; }e[M]; int n,m,cnt,head[N],out[N],dep[N]; dl f[N][3]; inline void add(int u,int v){ e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;out[u]++; } void init(){ for(int i=1;i<=n;i++){ head[i]=0;out[i]=1; f[i][1]=f[i][2]=0; } cnt=0; } dl F(int u,int j){ if(u==n)return 0; if(f[u][1]>0&&f[u][2]>0)return (f[u][2]-f[u][1])*(j-1)+f[u][1]; dl sum=(dl)out[u]/(out[u]-1)*j+(dl)out[u]/(out[u]-1)/(out[u]-1); for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; dl div=(out[u]-1)*(out[u]-1); dl a1=-F(v,j);dl a2=F(v,j+1)*out[u]; sum+=(a1+a2)/div; } return f[u][j]=sum; } int main(){ int T=read(); for(int cas=1;cas<=T;cas++){ n=read(),m=read(); init(); for(int i=1;i<=m;i++){ int u=read(),v=read();add(u,v); } printf("%.2Lf\n",F(1,1)); } return 0; }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
原文地址:https://www.cnblogs.com/luyouqi233/p/11444023.html