【SHOI2017】分手是祝愿(dp毒瘤)

tag:概率期望,dp,推柿子


50分部分分入手

其实有80分

首先考虑\(k=n\)的部分分

  • 倒着扫,遇到有\(1\)的位置就操作一下

正确性:

  • 一个点不会被操作\(2\)次以上,因为\(2\)次操作相当于没操作

  • 操作\(i\)不会影响到比\(i\)大的数

  • 所以从后往前扫,若遇到\(1\)不操作,那么前面的操作也不会改变这个\(1\),所以必须操作

正解

首先若最小步数小于等于\(k\),直接输出\(ans\cdot n!\)就好了

问题在于最小步数大于\(k\)的情况

容易发现上面那个操作序列是固定的

用一个\(01\)序列表示每个点需不需要操作(例子:\(101100\)表示\(1,3,4\)需要被操作)

然后容易发现最优的操作次数即为这个序列中\(1\)的个数,也就是说和序列长什么样子无关,只关心有多少个\(1\)

所以考虑设\(f[i]\)表示序列中有\(i\)\(1\)的期望操作次数

  • 如果乱选选到了\(0\)\(1\)的个数会多一个
  • 如果乱选选到了\(1\)\(1\)的个数会少一个
  • 所以有:\(f[i]=\frac inf[i-1]+\frac{n-i}nf[i+1]+1\)

然后是玄学推式子

  • 注意到\(f[n]=f[n-1]+1\),我们把它作为边界条件
  • \(f[n-1]=\frac{n-1}n f[n-2]+\frac1n f[n]+1\)
  • 将第一个式子带入
  • \(f[n-1]=\frac{n-1}n f[n-2]+\frac1n f[n-1]+\frac{n+1}n\)
  • 移项后处理一下系数得到:
  • \(f[n-1]=f[n-2]+\frac{n+1}{n-1}\)

发现这个东西长成这个样子\(f[n]=f[n-1]+\)关于\(n\)的式子,\(f[n-1]=f[n-2]\)+关于\(n\)的式子

然后大胆猜想不需要求证,这个关于\(n\)的式子(设为\(g[i]\))可以递推出来

  • \(f[i-1]=\frac{i-1}n f[i-2]+\frac{n-i+1}n f[i]+1\)
  • 因为我们猜想\(f[i]=f[i-1]+g[i]\),将它带入
  • \(f[i-1]=\frac{i-1}n f[i-2]+\frac{n-i+1}n f[i-1]+\frac{n-i+1}ng[i]+1\)
  • 移项后处理一下系数:
  • \(f[i-1]=f[i-2]+\frac{n-i+1}{i-1}g[i]+\frac n{i-1}\)
  • 所以有:\(g[i-1]=\frac{(n-i+1)g[i]+n}{i-1}\)
  • 换个样子:\(g[i]=\frac{(n-i)g[i+1]+n}i\)

然后\(g[i]\)就可以倒着递推出来了

接着\(f[i]\)也可以正着递推出来

dp式子总结

  • \(f[k]=k\)
  • \(f[i]=f[i-1]+g[i]\)
  • \(g[n]=1\)
  • \(g[i]=\frac{(n-i)g[i+1]+n}i\)
  • \(ans=f[min\_step]\cdot n!\)\(min\_step\)指的是原序列最小操作次数)
posted @ 2021-07-01 15:31  oisdoaiu  阅读(48)  评论(0编辑  收藏  举报