笑死比赛时读错题了.
题意
给一个大小为n的排列P, 两个人在上面选数, 要求如下:
- 某个人选的数的下标要比之前这个人选的大
- 每次选的数值要比之前两个人选的数都大
每次选都是等概率从可以选的数中选一个, 第一个人随便选(选择每个数的概率都是 1 n \frac{1}{n} n1). 最后不能选了结束. 问结束时期望两人一共选多少个数.
n ≤ 5000 n \le 5000 n≤5000
题解
!注意下标是比自己之前选的大, 不和对方比较.
补一下基础知识: 期望dp
期望dp一般这样设:
d
p
(
i
)
dp(i)
dp(i) 为当前在
i
i
i, 还需要期望
d
p
(
i
)
dp(i)
dp(i) 的代价到终点(不是从起点开始到dp[i]期望步数)
方程一般长这样:
d p ( i ) = v i + ∑ p j d p ( j ) dp(i) = v_i + \sum p_j dp(j) dp(i)=vi+∑pjdp(j)
其中 v i v_i vi 是这一步的代价, j j j 是后继状态, p j p_j pj 是这个从状态 i i i 走到状态 j j j 的概率. 答案是起点的dp值, 比如 d p ( 0 ) dp(0) dp(0).
在这个题中, 走一步对应的代价是1, 而等概率选取, 则某个 i i i 在方程中对应的 p j p_j pj 都是相等的, 且是 1 o u t i \frac{1}{out_i} outi1, o u t i out_i outi 表示 i i i 的后继个数.
这个题是两个人在走, 所以状态要两维, 设 d p ( i , j ) dp(i, j) dp(i,j) 表示第一个人在 i i i, 第二个人在 j j j, 期望还需要走多少步结束. 还需要考虑是哪一个人走, 由于是排列, 并且满足每次选的数比所有人上次的大, 所以比对手大, 这样直接判断 a i , a j a_i, a_j ai,aj 的大小关系就可以知道是谁在走了.
方程分两部分转移
- a i > a j a_i > a_j ai>aj, 第二个人走: d p ( i , j ) = 1 + 1 c 1 ∑ d p ( i , k 1 ) dp(i, j) = 1 + \frac{1}{c_1} \sum dp(i, k_1) dp(i,j)=1+c11∑dp(i,k1), 其中, k 1 k_1 k1 满足 k 1 > j , a k 1 > a i k_1 > j, a_{k_1} > a_i k1>j,ak1>ai, c 1 c_1 c1 是满足该条件的 k k k 的个数
- a i < a j a_i < a_j ai<aj, 第一个人走: d p ( i , j ) = 1 + 1 c 2 ∑ d p ( k 2 , j ) dp(i, j) = 1 + \frac{1}{c_2} \sum dp(k_2, j) dp(i,j)=1+c21∑dp(k2,j), 其中, k 2 k_2 k2 满足 k 2 > i , a k 2 > a j k_2 > i, a_{k_2} > a_j k2>i,ak2>aj, c 2 c_2 c2 是满足该条件的 k k k 的个数
朴素转移复杂度 O ( n 3 ) O(n^3) O(n3), 需要优化. 显而易见, k 1 k_1 k1 要满足比 j j j 大, 且 k 1 , j k_1, j k1,j 都是第二维, k 2 k_2 k2 和 i i i 同理. 那么可以逆序枚举, 用前缀和(后缀和)的思想来加速转移, 同时可知, 1 / c 1 ∑ d p ( i , k 1 ) 1/c_1 \sum dp(i, k_1) 1/c1∑dp(i,k1) 和 j j j 无关(关系已经通过转移顺序搞掉了).
设 f ( i ) = ∑ d p ( i , k 1 ) , c 1 ( i ) f(i) = \sum dp(i, k_1), c_1(i) f(i)=∑dp(i,k1),c1(i) 为第一个方程中的 c 1 c_1 c1. 对称地, 再设 g ( j ) = ∑ d p ( k 2 , j ) , c 2 ( j ) g(j) = \sum dp(k_2, j), c_2(j) g(j)=∑dp(k2,j),c2(j). 以第一个方程为例, 现在还需要考虑的是 d p ( i , k 1 ) dp(i, k_1) dp(i,k1) 的另一个条件 a k 1 > a i a_{k_1} > a_i ak1>ai. 只有这样的状态, 才能够对 f ( i ) f(i) f(i) 产生贡献. 然后会发现, 满足这个条件的状态, 不就是第二个方程吗? 所以做完第二个方程, 即 a i < a j a_i < a_j ai<aj 的 d p ( i , j ) dp(i, j) dp(i,j) 后, 把它加到 f ( i ) f(i) f(i) 中, 同时 c 1 ( i ) + 1 c_1(i)+1 c1(i)+1. 另一边同理.
这样就把复杂度降到了 O ( n 2 ) O(n^2) O(n2).
答案需要枚举一下第一个人选的位置, 第二个人在0, 即 d p ( i , 0 ) dp(i, 0) dp(i,0), 第一个人等概率选, 所以最后是 1 n ∑ i = 1 n d p ( i , 0 ) \frac{1}{n} \sum_{i=1}^n dp(i, 0) n1∑i=1ndp(i,0)