zoukankan      html  css  js  c++  java
  • DP总结

    \(DP\)总结

    \(DP\)专题将暂时告一段落,在此做一个小小的总结.我从最近做的题中挑选了几道对我比较有启发的题目,做一个复习与回顾.

    P3239 [HNOI2015]亚瑟王

    Link

    ​ 根据期望的线性性质,我们可以把每一张牌的期望伤害分别计算出,然后累加,这一定是正确的.

    ​ 我们记\(P_i\)为第\(i\)张牌发动的概率.易知:\(P_0=1-(1-p_0)^r\),即第一张牌不发动的概率是整场游戏都不发动的概率.

    ​ 但是,由于一张牌一旦发动,立即结束该轮,其余的\(P_i\)并不能这样直接算出.但是我们可以得到一个信息:\(P_i\)与前面的牌是否发动有关,但是与前面具体哪张牌被发动无关.

    ​ 考虑设\(f_i,_j\)为在全部的\(r\)轮中,前\(i\)张牌中被发动了\(j\)张牌的概率.那么,对于\(P_i\),我们可以得到这样的一个式子:\(P_i=\sum\limits_{j=0}^{i-1}f[i-1][j]*(1-(1-p_i)^{r-j})\).意思是对于前\(i-1\)张牌选了\(j\)张,那么会有\(r-j\)轮选到第\(i\)张牌,发动的概率就为\(1-(1-p_i)^{r-j}\).

    ​ 那么现在的问题就是求\(f_{i,j}\),分情况讨论:第一种,成功发动了第\(i\)张牌,那么,\(f_{i,j}\)将会从\(f_{i-1,j-1}\)转移过来,即\(f_{i,j}=f_{i-1,j-1} \times (1-(1-p_i)^{r-j+1})\);第二种,发动第\(i\)张牌失败,那么\(f_{i,j}\)将会从\(f_{i-1},j\)转移,即\(f_{i,j}=f_{i-1,j} \times p_i^{r-j}\).

    ​ 最终答案就是\(\sum P_i \times d_i\).

    ​ 这道题一步步算出结果的过程我觉得很有意义,一个式子算不出来,就把他用别的手段表示,使题目简单化,化繁为简,一步步得到答案.

    P4457 [BJOI2018]治疗之雨

    Link

    ​ 相信我们对一种概率模型已经很熟悉了:一张图,相邻点间互相有\(P\)的概率到达,求到一个点的期望步数.显然可以列方程用高斯消元求解.

    ​ 对于这道题,我们可以把每一个血量值抽象成点,转化成图.

    ​ 那么我们现在要求的就是血量之间转移的概率.我们又可以想到,对于每一个血量值,失去相同血量的概率是等同的.(不考虑最大值限制)

    ​ 考虑\(k\)局中失去\(i\)滴血的概率\(P_i\),显然我们会得到\((\dfrac{1}{m+1})^i(\dfrac{m}{m+1})^{k-i}\),但是还要考虑到不同的扣血顺序是不同的,故概率为\(C_k^i(\dfrac{1}{m+1})^i(\dfrac{m}{m+1})^{k-i}\).

    ​ 解决了这个,在考虑在题目条件下血量之间转化的概率.

    ​ 考虑\(i\)滴血转移到\(j\)滴血的概率.对于\(i \neq n\),则概率为\(\dfrac{m}{m+1}P_{i-j}+\dfrac{1}{m+1}P_{i-j+1}\),

    对于\(i=n\),则为\(P_{i-j}\),对于\(j=i+1\),则为\(\dfrac{1}{m+1}P_0\).

    ​ 有了这些,设\(E_i\)为血量为\(i\)时归零的期望步数.那么可以得出以下方程:

    ​ 对于\(i \ne n\),\(E_i=\sum\limits_{j=1}^i(\dfrac{m}{m+1}P_{i- j}+\dfrac{1}{m+1}P_{i-j+1})E_j+\dfrac{1}{m+1}P_0E_{i+1}+1\)

    ​ 对于\(i=n\),\(E_i=\sum\limits_{j=1}^iP_{i-j}E_j+1\)

    ​ 这样我们就可以高消解方程了.但是此题要手动高消,时间复杂度为\(O(n^2)\).

    ​ 这题模型的转化我感觉很巧妙,也很经典,式子的推导不难,但是需要严谨的分类讨论,最后的高消也很有价值.

    P4516 [JSOI2018]潜入行动

    Link

    ​ 树形背包显然,状态也比较好设,设\(dp_{u,j,0/1,0/1}\)\(u\)\(u\)的子树中共有\(j\)个监听设备,\(u\)节点是否监听设备有,\(u\)节点是否被监听的方案数.

    ​ 开始讨论.

    ​ 对于\(u\)节点没有监听设备,也没被监听.显然,只可能由已被监听且未安装监听设备的儿子转移过来:

    \(dp_{u,j+k,0,0}=\sum\limits_{v \in son}dp_{u,j,0,0} \times dp_{v,k,0,1}\)

    ​ 对于\(u\)节点有监听设备,但没有被监听.那么儿子必须要求没有装监听设备,至于是否被监听没有要求:

    \(dp_{u,j+k,1,0}=\sum\limits_{v \in son}dp_{u,j,1,0} \times dp_{v,k,0,0/1}\)

    ​ 对于\(u\)节点没有监听设备,但已被监听.那么儿子首先必须被监听.其次,儿子可以装了监听设备的任意的自己组成方案,还可以没有装监听设备,与已被监听的自己组成方案:

    \(dp_{u,j+k,0,1}=\sum\limits_{j \in son}dp_{u,j,0,0} \times dp_{v,k,1,1}+dp_{u,j,0,1} \times dp_{v,k,0/1,1}\)

    ​ 对于\(u\)节点有监听设备,且已经被监听.对于有监听设备且已被监听的自己,可以任意选择儿子组成方案,对于有监听设备但是未被监听的自己,可以选择任意已被监听的儿子组成方案:

    \(dp_{u,j+k,0,1}=\sum\limits_{j \in son}dp_{u,j,1,0} \times dp_{v,k,1,0/1}+dp_{u,j,1,1} \times dp_{v,k,0/1,0/1}\)

    ​ 在树上使用背包合并,卡好上界,复杂度\(O(nk)\).

    ​ 这道题的重点在于方程的讨论,需要一点点想,很扣细节,是一道很有意思的题目.

    P3354 [IOI2005]Riv 河流

    Link

    ​ 树形\(DP\)肯定是的,但是状态似乎并不好考虑.一个节点所产生的贡献与祖先有关,而且祖先也是不固定的,所以就似乎陷入了一个僵局.

    ​ 但是,看到\(n \le 100\)的数据范围,心中涌现出了一个小小的想法,直接把哪一个祖先建立了伐木场当做一维状态,似乎有了点曙光?

    ​ 设状态\(f_{u,p,j}\)表示\(u\)的祖先\(p\)有伐木场,\(u\)及其子树共\(j\)个伐木场,并且\(u\)建了伐木场.再设一个\(g_{u,p,k}\)表示没有建.

    ​ 在\(Dfs\)的过程中,可以用栈记录沿途走过的祖先,这样就可以枚举祖先了.

    ​ 对于\(f_{u,p,k}\),可以这样转移:\(f_{u,p,j+k}=\min\limits_{v \in son}f_{u,p,j}+f_{v,u,k}\)

    ​ 对于\(g_{u,p,k}\),可以这样转移:\(g_{u,p,j+k}=\min\limits_{v \in son}g_{u,p,j}+f_{v,p,k}\)

    ​ 之后再把到没算的花费加上去即可.

    ​ 这道题考虑祖先使得\(DP\)后效性并不好消除,但是可以通过枚举祖先使其成为状态的以为,从而达到无后效性.

    总结

    ​ 上面几道题之所以收进这个总结中,是因为在做这几道题的过程中,都给我提供了不一样的思路与想法,并且感觉有一些代表性,有所启发.

  • 相关阅读:
    通过DataSet操作XML
    什么是网站流量
    JavaScript总结(2)网页上显示时间
    对xml操作的主要方法
    xml保存图片和读取图片(三)
    SharePoint初探sharepoint 安装宝典(2)
    SharePoint初探启用wss的全文搜索(6)
    转载:sharepoint portal server2003安装小记
    SharePoint初探装完Wss后,无法创建或打开原有Web项目问题(7)
    SharePoint初探SharePoint网站整理(8)
  • 原文地址:https://www.cnblogs.com/zjy123456/p/13714778.html
Copyright © 2011-2022 走看看