zoukankan      html  css  js  c++  java
  • [算法]概率与期望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] imes dp[i+k])+dp[0] imes 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] imes A[i + k] imes f[0] + p[k] imes B[i + k]) + f[0] * p[0] + 1 ]

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

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

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

    进阶

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

    技巧

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

  • 相关阅读:
    Js:返回上一页
    select设置选中项/select的级联
    js闭包
    bootstrap
    My97DatePicker使用 、layDate 日期与时间组件
    IO流
    java之String工具类和File类
    Python学习之路文件file常用方法
    Python学习之路-集合set的常用方法
    Python学习之路-字典外传
  • 原文地址:https://www.cnblogs.com/linzhengmin/p/11261550.html
Copyright © 2011-2022 走看看