Base基站选址(线段树优化dp)
首先写dp转移式, $dp(i,j)$表示在第i位修建第j个基站。
定义$l(i)$为能覆盖i的最靠左的基站,$r(i)$为能覆盖i的最靠右的基站,
l和r数组均可以用二分求出,
$dp(i,j)=min( dp(u,j-1)+cost(u,i)+c(i) )$ $(0<=u<i)$。
$cost(u,i)$表示在u,i间不能被覆盖的村庄w值和,
即$cost(u,i)=sum limits_{o=u}^{i} w(o)$ $l(o)>u igcap r(o)<i$
设$weight(u)=cost(u,i)+dp(u,j-1)$,
如果可以维护weight的最小值,那么就可以直接用线段树logn转移,
显然$dp(u,j-1)$可以直接更新,难点是cost的更新。
注意一个问题,d具有单调性,如果一个点不能被点l覆盖,
那么它必然也不能被l-1覆盖,可以使用区间修改,
对于每个村庄x,它如果不能被覆盖,需要被补偿,即$i>r(x) igcap u<l(x)$
则可在处理完$r(x)$后对$l(x)$以前的weight值更新,使用vector记录每个点的$r(x)$值即可。
因为建第j个的dp值只与j-1有关,可以使用滚动线段树维护。
奇怪的道路(状压dp)
观察数据范围,看到k非常小,可以利用这一点进行状压dp
$dp(i,j,o)$表示目前在第i位,已经有j条边,当前从 i一直到i+k 的奇偶性的状态种数。
枚举状态,有$dp(i,j+1,o$ $xor$ $1$ $xor$ $p)+=dp(i,j,o)$。
由i转移到i+1位$dp(i+1,j,o)+=dp(i,j,o)$ $((i$ $and$ $1)==0)$
最终目的$dp(n+1,m,0)$
需要注意的是循环的顺序,这样才可以保证种数不重复。
如果先枚举边数,一定会导致同一状态的重复。
先枚举终点,可以保证以前枚举过的边不会再枚举到,就不会导致重复。
概率充电器(概率 树形dp)
每个点如果被充电,只可能有三种情况,
自己充上电,父亲有电且自己和父亲的边联通,儿子有电且自己和儿子的边联通
如果定义状态为充上电的概率,式子列的很麻烦,
不妨定义$p(x)$为点x不能充上电的概率,
$q(x)$为点x自己发电的概率,$data(x,y)$为边x,y联通的概率
$p(x)=(1-q(x))*prod (1-data(x,i)+data(x,i)*p(i))$
或$p(x)=(1-q(x))*prod (p(i)+(1-p(i))*(1-data(x,i)))$
上式中i为与x相连的点
两种计算方式是等价的,
第一种的解释为,该点不自己发电 * 边不联通 或 边联通且联通点无电
第二种的解释为,该点不自己发电 * 联通点无电 或 联通点有电且边不联通
有后效性,但n的范围过大不支持高斯消元
考虑树形dp,第一次dfs更新子树和自己对该节点的贡献
第二次dfs更新除子树和自己以外的点对该节点的贡献
因为只有乘的操作,更新的时候把以它为根的子树贡献除回去即可
答案显然为$sum limits_{i=1}^{n}(1-p(i))$
走迷宫(高斯消元 tarjan缩点)
INF的条件为,存在一个点,起点能到达但它无法到达终点。
定义$E(x)$为x到终点的期望长度,显然$E(t)=0$
$E(x)=sum limits_{i=1} E(i)/out(x) +1$ i为x的出边所连点
数据范围,如果对全图高斯消元,将TLE
题中提示强连通分量大小不超过100
可以在强连通分量形成的DAG图的反图上进行拓扑排序
对于每个强连通分量进行高斯消元,强连通分量中每个点的出边已经处理好,则可以解出该强连通分量中每个点的答案
目标即$E(s)$
XOR和路径(期望 高斯消元)
算法一:
因为是位运算,加上300的数据范围,显然要按位来进行高斯消元
给每个点开一个0域和一个1域,分别表示经过这一点且目前的xor和值为0和1的期望次数,显然该状态可以由它的每一个入边所连的点的状态转移而来。至于由0域还是1域,由边权该位为0还是1决定。
初始在起点,所以给起点的0域期望值加一,作为初始值以解出其他期望。
因为终点的期望经过次数必定为1
答案即每次消元终点1域的期望值乘该位对应的值大小 之和
算法二:(%yxm)
注意到终点没有出边,这是算法一中忽略的点
刚开始打的时候想到了可以直接对概率进行消元,但起点概率未知,于是只好打出了算法一
同理按位高斯消元
定义状态为该点到终点xor值为1的概率
显然终点的概率为0
一个点的概率可以由它的出边为1概率转移而来
答案即每次消元起点的概率乘该位对应的值大小 之和
卡牌游戏(dp 期望)
可以发现一个特点,当人数固定的时候,每个人的胜率都是固定的
于是可以以游戏进行的逆过程进行dp,即倒着dp
当只剩下一个人的时候 显然他的胜率是1
我们需要知道当前轮是谁在坐庄,但是如果多加一维dp,就会很臃肿,不妨让每轮坐庄的人都换到1号位
于是可以进行dp,该状态由人数减一,这个人下一次的编号转移过来
因为庄家始终是1,这个人下一次的编号就是这一次的编号减去卡牌上的数字,当然应该对一个数取模
OSU(期望)
$(n+1)^3-n^3=3n^2+3n+1$
每一次新增一个操作,目前的期望得分应该是 前一个期望得分 加上 期望的得分增量
期望得分增量与当前的期望连续1长度有关
每次的长度增量必定是1,于是可以处理出当前期望的长度和长度平方的期望,注意后者不等于前者的平方
硬币游戏
数据范围n<=300 加上如此诡异的数据,应该是高斯消元了
设P(i)表示完成第i个串的概率
诡异点:引入一个P(0)表示 一个串也不能匹配上的概率
于是P(i)可以用P(0)来表示
在P(0)后面接m个字符,可以凑成P(i)
但是还有已经可能凑成其它的字符串j,那么这个j一定满足j的后缀等同于字符串i的前缀,并且字符串0的后缀等同于字符串j的未匹配的前缀
$sum limits_{j=1} sum limits_{k=1} P(j)*1/2^{m-k}+P(i)=P(0)*1/2^m$
k为匹配的长度
还差最后一个方程才能解出n+1个变量,这个方程就是$sum limits_{i=1} P(i)=1$,即所有串的概率总和是1