[算法]概率与期望DP

前言

前两节主要针对题目分析,没时间的珂以跳过。

初步

首先举一道简单、经典的好题:
[Lightoj1038]Race to 1 Again
懒得单独写,安利一下DennyQi同学的博客:https://www.cnblogs.com/qixingzhi/p/9346307.html。
很显然很多期望题的状态是和自己有关的,怎么办呢,难道不停的搜索自己?
上面的方法显然行不通,于是我们只能简单变形一下。
很容易列出方程:

\[f[n]= \frac{\sum_{i=1}^{m}f[fac_n^i]}{m} + 1 \]

其中\(m\)表示因子个数,\(fac_n^i\)表示\(n\)的第\(i\)个因子。
鉴于要让右边消去后效性,两边同时乘以\(m\),移项即可。


再举一道稍微复杂一点的题目:
[zoj3329]One Person Game
题意简述:
有三个骰子,分别有k1, k2, k3个面。
记录一个初值为0的分数,每次掷骰子,如果三个面分别为a, b, c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。
设f[i]为当前已经获得了i分时,游戏结束的期望步数。
为了方便表示我们不妨设p[i]为投到点数为i的概率,特殊的p[0]为回到0的概率。
很容易想到如下递推:

\[f[i]=\sum(p[k] \times dp[i+k])+dp[0] \times p[0]+1 \]

一眼看过去大清亡了,成环了,能用高斯消元也就算了,关键是高斯消元会TLE。
我们发现我们需要求的东西只有f[0],于是我们分离常数,令f[i]=A[i]*f[0]+B[i]
那么显然我们要求的f[0]就喜闻乐见地变成了\(\frac{B[0]}{1-A[0]}\)
显然我们只需要递推计算A与B就能求出答案(废话)。
那么稍加变形得到A,B的递推式如下

\[f[i] = \sum(p[k] \times A[i + k] \times f[0] + p[k] \times B[i + k]) + f[0] * p[0] + 1 \]

\[=(\sum(p[k] \times A[i + k]) + p[0]) f[0] + \sum(p[k] \times B[i + k]) + 1 \]

\[A[i]=\sum(p[k] \times A[i+k])+p[0],B[i]=\sum(p[k] \times B[i+k])+1 \]

那么求A, B就变得非常简单了QAQ。

进阶

对于未知状态彻底成环又无法转化的情况,只能使用高斯消元。
咕咕咕。

技巧

1、变形递推式消去后效性
2、只求部分值可以分离常数
3、成环使用高斯消元
咕咕咕,(flag:预计本周补完)。

posted @ 2019-07-28 23:54  LinZhengmin  阅读(369)  评论(0编辑  收藏  举报

Contact with me