[算法]概率与期望DP
Posted linzhengmin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]概率与期望DP相关的知识,希望对你有一定的参考价值。
前言
前两节主要针对题目分析,没时间的珂以跳过。
初步
首先举一道简单、经典的好题:
[Lightoj1038]Race to 1 Again
懒得单独写,安利一下DennyQi同学的博客:https://www.cnblogs.com/qixingzhi/p/9346307.html。
很显然很多期望题的状态是和自己有关的,怎么办呢,难道不停的搜索自己?
上面的方法显然行不通,于是我们只能简单变形一下。
很容易列出方程:
\\[f[n]= \\frac\\sum_i=1^mf[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]就喜闻乐见地变成了\\(\\fracB[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:预计本周补完)。
以上是关于[算法]概率与期望DP的主要内容,如果未能解决你的问题,请参考以下文章
XSY2518记忆(memory)(状压dp,概率与期望,概率dp)