2021 牛客多校第一场 I.Increasing Subsequence

笑死比赛时读错题了.

题目

题意

给一个大小为n的排列P, 两个人在上面选数, 要求如下:

  • 某个人选的数的下标要比之前这个人选的大
  • 每次选的数值要比之前两个人选的数都大

每次选都是等概率从可以选的数中选一个, 第一个人随便选(选择每个数的概率都是 1 n \frac{1}{n} n1). 最后不能选了结束. 问结束时期望两人一共选多少个数.

n ≤ 5000 n \le 5000 n5000

题解

!注意下标是比自己之前选的大, 不和对方比较.

补一下基础知识: 期望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+c11dp(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+c21dp(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/c1dp(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) n1i=1ndp(i,0)

代码

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值