动态规划-简单了解下什么是期望DP

这篇具有很好参考价值的文章主要介绍了动态规划-简单了解下什么是期望DP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先说明下为啥是简单了解下,因为对于期望DP的问题,相较于一般的动态规划问题,可以说期望DP的题目相对较少,并且往往具有一定的难度。这是因为期望DP在解决问题时需要考虑状态的期望值,涉及到概率和随机性的计算,因此可能需要运用更多的数学知识和技巧,所以我们作为入门还是了解下。

期望DP是一种动态规划的应用方法,用于解决具有期望值的问题。在许多问题中,我们不仅关心某个状态的具体值,还关心该状态的期望值,即在多次实验中,该状态的平均值。期望DP就是利用动态规划的思想,计算解决具有期望值的问题。

在期望DP中,我们将问题转化为求解状态的期望值,而不仅仅是状态的具体值。通过定义状态和状态转移方程,我们可以递推计算得到状态的期望值,从而求解问题。通常,期望DP与普通的动态规划方法类似,但需要在状态转移方程中加入期望值的计算。

期望DP的一个难度在于没有一个固定的模板,只有一个大致框架:

#include <iostream>
#include <vector>

using namespace std;

// 定义全局变量
const int MAX_N = 1000;
double dp[MAX_N];  // 存储状态值

double expectedDP(int n) {
    // 初始化边界条件
    dp[0] = 0;  // 根据具体问题进行初始化

    // 动态规划状态转移
    for (int i = 1; i <= n; i++) {
        // 定义状态转移方程
        dp[i] = (/*根据具体问题定义转移方程*/);
    }

    return dp[n];  // 返回最终的期望值
}

int main() {
    int n;
    cin >> n;

    cout << "Expected DP: " << expectedDP(n) << endl;

    return 0;
}

dp 数组用于存储不同状态下的期望值。因为是大致框架,你需要根据具体的问题定义状态转移方程中的计算逻辑。在实际使用中,根据问题的不同,可能需要引入更多的辅助变量和数据结构来存储和计算期望值
我们同样通过一道例题来对期望DP的实际应用留下印象。题目的意思是说一个游戏里面对英雄进行分类,一共有 nn 种职业, mm 种阵营。小蓝每天玩一个英雄,这个英雄属于某一种职业,也属于某一种阵营。每个英雄属于某个职业的概率是 1nn1​ ,属于某种阵营的概率是 1mm1​ 。求小蓝玩遍了所有职业和阵营的期望天数。

大致思路:

令 dp[i][j] 为小蓝已经玩过 i 种职业,j个阵营之后,达到最终状态的期望天数。这里的最终状态是玩遍所有的职业与阵营。

那么我们可以得到 dp[n][m]=0 ,因为已经达到了目标状态,所以我们可以倒推,我们要求的答案就是 dp[0][0]。(求概率一般是正推,求期望一般是逆推)。

考虑 dp[i][j]的状态转移:

  • 目前玩的英雄的职业和阵营之前都玩过,转移到 dp[i][j] ,概率为 p1= i/n * j/m 。
  • 目前玩的英雄的职业玩过,阵营没玩过,转移到 dp[i][j+1],概率为 p2=i/n * (m - j)/m 。
  • 目前玩的英雄的职业没玩过,阵营玩过,转移到 dp[i+1][j] ,概率为 p3=(n - i)/n  * j/ m。
  • 目前玩的英雄的职业和阵营都没玩过,转移到 dp[i+1][j+1],概率为 p4=(n - i)/n  * (m - j)/m​ 。

再根据期望的线性性质,可以得到转移方程为:

dp[i][j]=p1×dp[i][j]+p2×dp[i][j+1]+p3×dp[i+1][j]+p4×dp[i+1][j+1]+1dp[i][j]=p1​×dp[i][j]+p2​×dp[i][j+1]+p3​×dp[i+1][j]+p4​×dp[i+1][j+1]+1 。

这里最后的 +1 是因为要消耗一天来玩英雄。之后移项可以得到:

(1−p1)dp[i][j]=p2×dp[i][j+1]+p3×dp[i+1][j]+p4×dp[i+1][j+1]+1(1−p1​)dp[i][j]=p2​×dp[i][j+1]+p3​×dp[i+1][j]+p4​×dp[i+1][j+1]+1 。

再把系数除过去得到:

dp[i][j]=p2×dp[i][j+1]+p3×dp[i+1][j]+p4×dp[i+1][j+1]+11−p1dp[i][j]=1−p1​p2​×dp[i][j+1]+p3​×dp[i+1][j]+p4​×dp[i+1][j+1]+

(最后经过数学方法移项将p1,p2,p3,p4带入即可)。

原题链接:

https://www.lanqiao.cn/problems/4337/learning/?page=1&first_category_id=1&name=%E5%B0%8F%E8%93%9D%E7%8E%A9%E6%B8%B8%E6%88%8F文章来源地址https://www.toymoban.com/news/detail-836549.html

到了这里,关于动态规划-简单了解下什么是期望DP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DP算法:动态规划算法

    (1)确定初始状态 (2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来 (3)确定边界条件。 蓝桥杯——印章(python实现) 使用dp记录状态,dp[i][j]表示买i张印章,凑齐j种印章的概率 i表示买的印章数,j表示凑齐的印章种数 情况一:如果ij,不可能凑齐印章,概

    2024年02月07日
    浏览(51)
  • 算法——动态规划(DP)——递推

    动态规划常用于解决优化问题。 动态规划通常以自底向上或自顶向下的方式进行求解。 自底向上的动态规划从最简单的子问题开始,逐步解决更复杂的问题,直到达到原始问题。 自顶向下的动态规划则从原始问题出发,分解成子问题,并逐步求解这些子问题。 动态规划算法

    2024年01月20日
    浏览(57)
  • ★动态规划(DP算法)详解

    什么是动态规划:动态规划_百度百科 内容太多了不作介绍,重点部分是无后效性,重叠子问题,最优子结构。 问S-P1和S-P2有多少种路径数,毫无疑问可以先从S开始深搜两次,S-P1和S-P2找出所有路径数,但是当这个图足够大,那就会超时。 动态规划旨在用 空间换时间 ,我们

    2024年02月04日
    浏览(50)
  • 动态规划(DP)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子

    2024年02月05日
    浏览(47)
  • 【动态规划】简单多状态dp问题(2)买卖股票问题

    买卖股票问题 传送门:力扣309. 最佳买卖股票时机含冷冻期 题目: 1.1 题目解析 越难的dp问题,看示例只能起到了解题目的效果,一般推不出啥普遍的规律,所以接下来就是我们的算法原理,通过动归的思想去理解,才会豁然开朗! 1.2 算法原理 1.2.1 状态表示 我们需要通过经

    2024年02月12日
    浏览(56)
  • C++动态规划-线性dp算法

    莫愁千里路 自有到来风 CSDN 请求进入专栏                                    X 是否进入《 C++ 专栏》? 确定 目录  线性dp简介 斐波那契数列模型  第N个泰波那契数 思路: 代码测试:  三步问题 思路: 代码测试: 最小花费爬楼梯 思路: 代码测试:  路径问题 数字三

    2024年02月19日
    浏览(48)
  • 【算法】动态规划(dp问题),持续更新

    介绍本篇之前,我想先用人话叙述一般解决动态规划问题的思路: 动态规划的问题,本身有许多产生结果的可能,需要在具体题目下得到满足某个条件的解。 如何得到呢? 我们就需要根据这个具体问题,建立一个状态表( dp 表 ),在这张 dp 表中的每一个位置的数据都有明

    2024年02月04日
    浏览(49)
  • 【动态规划】简单多状态dp问题(1)打家劫舍问题

    打家劫舍问题 传送门:面试题 17.16. 按摩师 题目: 1.1 题目解析 越难的dp问题,看示例只能起到了解题目的效果,一般推不出啥普遍的规律,所以接下来就是我们的算法原理,通过动归的思想去理解,才会豁然开朗! 1.2 算法原理 1.2.1 状态表示 我们需要通过经验 + 题目要求去

    2024年02月12日
    浏览(43)
  • c++ 算法之动态规划—— dp 详解

    dp 是 c++ 之中一个简单而重要的算法,每一个 OIer 必备的基础算法,你知道它究竟是什么吗? 目录 一、简介         1.为什么不能贪心?         2.揭秘 dp   二、应用         1.定义         2.边界值         3.动态转移方程         4.结果         5.代码

    2024年04月09日
    浏览(48)
  • 算法套路十三——动态规划DP入门

    动态规划和递归都是通过将大问题分解为较小的子问题来解决问题。它们都可以用来解决具有重叠子问题和最优子结构特性的问题。 递归是一种自顶向下的方法, 它从原始问题开始 ,递归地将问题分解为较小的子问题dfs(i)—— dfs(i)代表的是从第i个状态开始进行递归求解能

    2024年02月15日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包