题目:
https://zoj.pintia.cn/problem-sets/91827364500/problems/91827369307
一只吸血鬼攻击力为 m m m,有 n n n条路给他走,每天他随机走一条路,每条路有个限制 c i c_i ci,如果当时这个吸血鬼的攻击力大于 c i c_i ci,那么就会花费 t i t_i ti天逃出去。否则,攻击力增加 c i c_i ci, 第二天继续选路。问他逃出去的期望天数。
思路:
令
f
(
i
)
f(i)
f(i)表示攻击力为
i
i
i时逃出去的期望,
f
(
i
)
=
0
f(i)=0
f(i)=0,对于所有的路,有
f
(
i
)
+
=
1
n
∗
t
j
(
t
j
>
i
)
f
(
i
)
+
=
1
n
∗
f
(
i
+
t
j
)
(
t
j
≤
i
)
\begin{aligned} f(i)+=&\frac{1}{n}*t_j\quad(t_j>i)\\ f(i)+=&\frac{1}{n}*f(i+t_j)\quad(t_j\le i) \end{aligned}
f(i)+=f(i)+=n1∗tj(tj>i)n1∗f(i+tj)(tj≤i)
刚开始想的时候多了一维
#include<bits/stdc++.h>
using namespace std;
const int N=109;
double f[N][N*N],ans;
int n,m,c[N],t[N];
double dfs(int x,int y)
{
if(y>c[x])
return (double)t[x];
if(f[x][y])
return f[x][y];
f[x][y]=1;
for(int i=1; i<=n; i++)
f[x][y]+=1.0/(double)n*dfs(i,y+c[x]);
return f[x][y];
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
ans=0;
memset(f,0,sizeof(f));
for(int i=1; i<=n; i++)
scanf("%d",&c[i]),t[i]=(int)((1+sqrt(5))/(double)2*c[i]*c[i]);
for(int i=1; i<=n; i++)
ans+=dfs(i,m)/n;
printf("%.3lf\n",ans);
}
return 0;
}