题目大意:
N个盘子,每个盘子中有1到3个寿司不等,T总每次随机选一个盘子,取一个寿司若没有则不取,求全部取完的期望次数
(关于期望dp请转移概率dp)
数据范围N
∈
\in
∈[1, 300].
提示:考虑dp
考虑设置dp状态
*** 很明显的三维
d
p
i
,
j
,
k
dp_i,_j,_k
dpi,j,k 表示盛一个寿司的盘子有i个,盛两个寿司的有j个,盛三个寿司的有k个的期望次数。
设开始时一个的有x个,两个寿司的有y个,盛三个寿司的有z个.
考虑转移:
W
A
Y
1
:
倒推
WAY1: 倒推\rm
WAY1:倒推(目标状态到初始状态)
d
p
i
,
j
,
k
dp_i,_j,_k
dpi,j,k表示从0,0,0到i,j, k的期望次数,
初始化
d
p
0
,
0
,
0
dp_0,_0,_0
dp0,0,0 = 0; 目标状态
d
p
x
,
y
,
z
dp_x,_y,_z
dpx,y,z
转移方式:
首先, 每一次选到当前状态下有寿司的盘子有
n
i
+
j
+
k
\frac{n}{i + j + k}
i+j+kn的期望次数
然后,有
i
i
+
j
+
k
\frac{i}{i + j + k}
i+j+ki的概率转移到
d
p
i
−
1
,
j
,
k
dp_i -1,_j,_k
dpi−1,j,k
有
j
i
+
j
+
k
\frac{j}{i + j + k}
i+j+kj的概率转移到
d
p
i
+
1
,
j
−
1
,
k
dp_i +1 ,_ j-1,_k
dpi+1,j−1,k
有
k
i
+
j
+
k
\frac{k}{i + j + k}
i+j+kk的概率转移到
d
p
i
,
j
+
1
,
k
−
1
dp_i,_j+1,_k-1
dpi,j+1,k−1
所以`
dp[i][j][k] += (double)(1.0 * n / (i + j + k));
if (i >= 1) dp[i][j][k] += (dp[i - 1][j][k] * (1.0 * i / (i + j + k)));
if(j >= 1) {
dp[i][j][k] += dp[i + 1][j - 1][k] * (1.0 * j / (i + j + k));
}
if (k >= 1){
dp[i][j][k] += dp[i][j + 1][k - 1] * (1.0 * k / (i + j + k));
}
Points:i,j, k的枚举顺序;i,j,k是否都为零的判断;i,j,k的枚举范围。
W
A
Y
2
:
正推
WAY2:正推\bf
WAY2:正推
话说期望dp一般都是倒推的呢
d
p
i
,
j
,
k
dp_i,_j,_k
dpi,j,k表示从i, j, k到x, y, z的期望次数,那么初始状态就有了
d
p
x
,
y
,
z
dp_x,_y,_z
dpx,y,z = 0, 目标状态->
d
p
0
,
0
,
0
dp_0,_0,_0
dp0,0,0;
考虑转移,这里的转移要比正推难一点:
我们采用push的递推方法,(For example : dp[i + 1] += d[i]; );
再维护一个f数组
f
i
,
j
,
k
f_i,_j,_k
fi,j,k 表示转移到i,j,k的概率,
f
x
,
y
,
z
f_x,_y,_z
fx,y,z = 1;
然后,有
f
i
,
j
,
k
f_i,_j,_k
fi,j,k
∗
*
∗
i
i
+
j
+
k
\frac{i}{i + j + k}
i+j+ki的概率转移到
d
p
i
−
1
,
j
,
k
dp_i -1,_j,_k
dpi−1,j,k
有
f
i
,
j
,
k
f_i,_j,_k
fi,j,k
∗
*
∗
j
i
+
j
+
k
\frac{j}{i + j + k}
i+j+kj的概率转移到
d
p
i
+
1
,
j
−
1
,
k
dp_i +1 ,_ j-1,_k
dpi+1,j−1,k
有
f
i
,
j
,
k
f_i,_j,_k
fi,j,k
∗
*
∗
k
i
+
j
+
k
\frac{k}{i + j + k}
i+j+kk的概率转移到
d
p
i
,
j
+
1
,
k
−
1
dp_i,_j+1,_k-1
dpi,j+1,k−1
贡献到i - 1, j, k的期望次数是(n / (i + j + k)
∗
*
∗ P(
ξ
\xi
ξ));
其中
ξ
\xi
ξ是从x, y, z转移到i - 1, j, k的事件, 所以P(
ξ
\xi
ξ)=
f
i
,
j
,
k
f_i,_j,_k
fi,j,k
∗
*
∗ i / (i + j +k );
贡献的期望值是
d
p
i
,
j
,
k
dp_i,_j,_k
dpi,j,k
∗
*
∗i/(i+j+k);
所以
d
p
i
−
1
,
j
,
k
dp_i - 1,_j,_k
dpi−1,j,k=(n / (i + j + k)
∗
*
∗
f
i
,
j
,
k
f_i,_j,_k
fi,j,k
∗
*
∗ i / (i + j +k )) +
d
p
i
,
j
,
k
dp_i,_j,_k
dpi,j,k
∗
*
∗i/(i+j+k);
d
p
i
+
1
,
j
−
1
,
k
dp_i +1 ,_ j-1,_k
dpi+1,j−1,k,
d
p
i
,
j
+
1
,
k
−
1
dp_i,_j+1,_k-1
dpi,j+1,k−1不难类推,详情如下。
long double E = (double)1.0L * n / (i + j + k);
long double G = dp[i][j][k] / f[i][j][k];
if (i >= 1) {
f[i - 1][j][k] += f[i][j][k] * i / (i + j + k);
dp[i - 1][j][k] += (G + E) * f[i][j][k] * i / (i + j + k);
}
if(j >= 1) {
f[i + 1][j - 1][k] += f[i][j][k] * j / (i + j + k);
dp[i + 1][j - 1][k] += (G + E) * f[i][j][k] * j / (i + j + k);
}
if (k >= 1) {
f[i][j + 1][k - 1] += f[i][j][k] * k / (i + j + k);
dp[i][j + 1][k - 1] += (G + E) * f[i][j][k] * k / (i + j + k);
}
如果代码实现有问题请私信或留言 😃;
B
y
e
Bye~~\it
Bye ~~