概率DP —— 入门

总算把 kuangbin 大大那个博客中的题(除了一道java。。)的题都做完了。。膜拜一下。。

http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html

Thoughts —— 算是入门了吧。。(真的吗。。= =)。。感觉概率/期望DP的话。。如何表示状态很关键。。转移比较好想。。然后就是怎么去处理这个转移。。因为一般情况下暴力消元是不可行的。。


先放一道智力题。。和概率DP没什么大关系。。

Poj 2151 。。给出 N<=1000 个队伍和 M<=30 个题目。。以及每个队伍做出每道题的概率。。问每个队至少过一题且至少有一个队过了 K 个题的概率?

。。正难则反。。求解每个队至少过一题且没有队过K道题的概率。。其实只要求出每个队正好过 i 个题的概率就成了。。

题目的一般解法一、列出方程直接高斯消元

模板题一、Hdu 2262 。。非常裸。。
模板题二、Hdu 4418 。。每个点分向左和向右两种情况来消元。。要先搜索来判断是否无解。。
模板题三、Zjut 1317 。。用两点的距离来描述状态会大大减小矩阵的大小。。


题目的一般解法二、因为答案可能会很大高斯消元会精度溢出。。要手动处理方程得到递推式以避免消元。。这之中又分为两种一般的方法。。

①、设根据方程组的特点(如都含有某一项等特性)设计新的能够直接递推出的函数

Zoj 3329 。。高斯消元是肯定会被卡精度的(高斯消元的精度一般都比较差)。。写一发可以发现最大值大概是10^7左右。。再留 1e-8 小数就肯定不行了。。所以应该用精度好的方法。。
dp[i] = Σdp[j]*p[j] + dp[0]*p[0] + 1。。观察到每一个式子都和 dp[0] 有关。。那就可以写成 dp[i] = A[i]*dp[0] + B[i] 。。拆开后递推 A[i] 和 B[i] 就可以了。。

Hdu 4035 。。这题真的是有点意思。。想要把树上方程组变成树上的新递推式只要定根后讨论 每个节点的父节点 和 dp[1] 就可以了(因为每个节点只有一个父亲)。。然后使劲推就可以了。。而且应该先写一个搜索来判断是否无解。。(还没写成。。)..已写完。。只要纸上推明白了就很好写。。写完没调就过了= =。。说明这种题还是不怎么耗费机时的QAQ


②、手动模拟方程的迭代

LA 6204 。。 很简单的题。。直接消元其实也未尝不可。。?。。还有很多人是暴力DP然后卡精度就过去了。。不过还有一种做法就是去用程序模拟这个游戏。。然后可能会出现环。。环上的部分迭代解开,然后再迭代回原点就是答案。。

Hdu 4089。。题意比较复杂不过做法比较明显。。很容易用状态 f[i][j] 表示当前还剩 i 个人,排在第 j 位列出方程组。。然后发现每一组 i 都是独立的。。相同的 i 中 j 会出现一个循环。。手动去解 j 部分的方程然后用 i-1 递推得到 i 。。要注意的是无论何时分母都不能够为 0 。。因此要之前对 p1 和 p2 进行特判。。(网上所说的判断 p4 其实是没有什么道理的。。。。


你可能感兴趣的:(概率DP —— 入门)