题目传送门
求最小期望,于是果断期望DP。
考试的时候猜对状态,但是完全不明白自己猜的这玩意怎么转移…敲暴力还忘清数组,12滚粗…
现在看,也挺恶心…
先搞出来一个两点最短路,Floyed即可。
状态表示为
d
p
[
i
]
[
j
]
[
0
/
1
]
dp[i][j][0/1]
dp[i][j][0/1],表示上了前
i
i
i节课,已经用了
j
j
j次机会,第
i
i
i节课不换/换教室的最小期望。
然后转移就很简单了,随便搞搞就行了…
d
p
[
i
]
[
j
]
[
0
]
=
min
{
d
p
[
i
−
1
]
[
j
]
[
0
]
+
d
i
s
[
c
i
−
1
]
[
c
i
]
d
p
[
i
−
1
]
[
j
]
[
1
]
+
d
i
s
[
d
i
−
1
]
[
c
i
]
∗
p
i
−
1
+
d
i
s
[
c
i
−
1
]
[
c
i
]
∗
(
1
−
p
i
−
1
)
dp[i][j][0]=\min \begin{cases} dp[i-1][j][0]+dis[c_{i-1}][c_i] \\ dp[i-1][j][1]+dis[d_{i-1}][c_i]*p_{i-1}\\ \qquad \qquad \ \ \ \ \ \ +dis[c_{i-1}][c_i]*(1-p_{i-1}) \end{cases}
dp[i][j][0]=min⎩⎪⎨⎪⎧dp[i−1][j][0]+dis[ci−1][ci]dp[i−1][j][1]+dis[di−1][ci]∗pi−1 +dis[ci−1][ci]∗(1−pi−1)
其中,第二个转移是针对前一个修改了而这一个未修改的情况。
不难推出第二种
1
1
1的情况。
d
p
[
i
]
[
j
]
[
1
]
=
min
{
d
p
[
i
−
1
]
[
j
−
1
]
[
0
]
+
d
i
s
[
c
i
−
1
]
[
d
i
]
∗
p
i
+
d
i
s
[
c
i
−
1
]
[
c
i
]
∗
(
1
−
p
i
)
d
p
[
i
−
1
]
[
j
−
1
]
[
1
]
+
d
i
s
[
d
i
−
1
]
[
d
i
]
∗
p
i
−
1
∗
p
i
+
d
i
s
[
d
i
−
1
]
[
c
i
]
∗
p
i
−
1
∗
(
1
−
p
i
)
+
d
i
s
[
c
i
−
1
]
[
d
i
]
∗
(
1
−
p
i
−
1
)
∗
p
i
+
d
i
s
[
c
i
−
1
]
[
c
i
]
∗
(
1
−
p
i
−
1
)
∗
(
1
−
p
i
)
dp[i][j][1]=\min \begin{cases} dp[i-1][j-1][0]+dis[c_{i-1}][d_i]*p_i\\ \qquad \qquad \qquad \quad \ +dis[c_{i-1}][c_i]*(1-p_i)\\ \\ dp[i-1][j-1][1]+dis[d_{i-1}][d_i]*p_{i-1}*p_i\\ \qquad \qquad \qquad \ \ \ \ \ \ +dis[d_{i-1}][c_i]*p_{i-1}*(1-p_i)\\ \qquad \qquad \qquad \ \ \ \ \ \ \ +dis[c_{i-1}][d_i]*(1-p_{i-1})*p_i\\ \qquad \qquad \qquad \ \ \ \ \ \ \ \ +dis[c_{i-1}][c_i]*(1-p_{i-1})*(1-p_i) \end{cases}
dp[i][j][1]=min⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧dp[i−1][j−1][0]+dis[ci−1][di]∗pi +dis[ci−1][ci]∗(1−pi)dp[i−1][j−1][1]+dis[di−1][di]∗pi−1∗pi +dis[di−1][ci]∗pi−1∗(1−pi) +dis[ci−1][di]∗(1−pi−1)∗pi +dis[ci−1][ci]∗(1−pi−1)∗(1−pi)
边界为
d
p
[
i
]
[
0
]
[
0
]
=
d
p
[
i
−
1
]
[
0
]
[
0
]
+
d
i
s
[
c
i
−
1
]
[
c
i
]
(
i
≥
2
)
d
p
[
1
]
[
0
]
[
0
]
=
0
d
p
[
i
]
[
0
]
[
1
]
=
+
∞
\begin{aligned} dp[i][0][0]&=dp[i-1][0][0]+dis[c_{i-1}][c_i]\ \ \ \ (i\ge 2)\\ dp[1][0][0]&=0\\ dp[i][0][1]&=+\infty \end{aligned}
dp[i][0][0]dp[1][0][0]dp[i][0][1]=dp[i−1][0][0]+dis[ci−1][ci] (i≥2)=0=+∞
答案为
min
(
d
p
[
n
]
[
i
]
[
0
]
,
d
p
[
n
]
[
i
]
[
1
]
)
i
∈
[
0
,
m
]
\min(dp[n][i][0],dp[n][i][1])\ \ \ \ i \in [0,m]
min(dp[n][i][0],dp[n][i][1]) i∈[0,m]
时间复杂度
O
(
v
3
+
n
m
)
O(v^3+nm)
O(v3+nm)
Code
[NOIP] [期望DP] [最短路] NOIP2016Day1 换教室
最新推荐文章于 2020-05-25 17:37:45 发布