POJ3071(Football)–概率DP

题意:有(1<

en….网上当然也后不少解题报告,但是很多直接给出状态转移方程和贴出代码,而少了其中重要的推断过程,我觉得不是很好。所以自己给写一个较为详细的过程

首先呢,以n==3为例子,即8支队伍参赛。一种比赛情形是这样的

由图可知,在题中给定n后,需要比赛n轮即可知道冠军队伍是谁,我这里多了个第0轮是为了后面计算需要

其次,对于DP的题目,我们 首先要明确状态转移方程代表的含义是什么,我们 已知什么,未知什么,怎么去确定合适的方程,这些是很重要的,当然,推出转移方程到后面更难的题目则是更重要的。

既然要求出最终能获胜的队伍,即 求出每个队伍的在最后一轮的胜率,最后取一个最大值就ok了。并且,获得 冠军的那支队伍既然能够到达最后一轮,那么,它一定经历了所有轮次的比赛,并且都赢了。在这每一轮比赛的胜率,就是子问题了。这是很简单就可以得出的。所以, 后一轮的胜率,肯定是由上一轮的胜率决定的。

所以, DP[i][j]可以这么定义,它表示为在第i轮中,第j只队伍的胜率。这也符合求解问题的逻辑,我们已知总共的 轮数(n),已知所有 队伍的数量(1<

DP的含义确定了,那么,状态转移方程怎么来呢??

首先,dp数组的 第一维表示的是整个赛事的轮数,所以外面有一层循环,接着 ,第二维表示每只队伍,所以又一层循环遍历每一只队伍。那么对应的概率到底怎么来呢…..

因为对于树中的 每个结点代表对应DP[i][j]的概率,即两支队伍某一方击败另一方,并且,这两支队伍在上一轮中都双双各自获胜,我们 直接看最后一轮比赛/最上面一个结点,因为,所有底下结点是子问题,性质都一样,所以可以得到部分转移方程:(假设最后一轮是j赢了,此时i==3,概率为DP[i][j])

DP[i][j] = DP[i-1][j] * DP[i-1][k] * ???;

DP[I-1][j]:表示本轮的赢家j在上一轮获胜的概率,上一轮一定是获胜了的再能到这一轮

DP[i-1][k]:表示本轮赢家j遇见的对手k,k在上一轮获胜的概率,k也晋级到了这一轮

???:这个表示什么呢???因为此时DP[i][j]表示这一轮是j获胜的概率,所以j战胜了k,那么胜率是多少呢??

在题中输入的矩阵中 第j行k列就是这里的概率

所以完整的状态转移方程:(当前概率+=上一轮二者分别获胜的概率 * 这一轮一方胜另一方的概率)

别以为到这里就结束了,k 的范围还没确定呢!!

从图中可知,在第二轮中 3号结点不会遇见所有的对手只有可能遇见来自另一边的5,6,7,8的某一个

而1,2,4是不可能再遇见了(已经淘汰了)。那么,k的编号怎么判断呢??(关键)

假设最后是 j和k进行决赛,那么表明j和k一定是在最后一轮相遇了,在倒数第二轮它们不会相遇,因为它们各自再进行半决赛(好像说了句废话,但是….)k的范围就这样确定。

因为到了最后一轮,所以遍历轮数的编号i此时为3,如图中,j为3,最后是k==7与之对决。

它们满足这样了个关系:

3 /(1<

公式是这样的

即对于某个j,判断k是否能和j同时成为一个点的左右孩子结点。这个条件就满足了对可能遇见的对手的的选取

这里还是要稍微思考下的。

Original: https://www.cnblogs.com/ygsworld/p/11312218.html
Author: 回忆酿的甜
Title: POJ3071(Football)–概率DP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582138/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • liunx安装docker (自我记录)

    1 安装 安装所需的软件包dnf install -y yum-utils device-mapper-persistent-data lvm2 安装 dnf install do…

    Linux 2023年6月7日
    0104
  • Java基础系列–07_Object类的学习及源码分析

    Java中Object根类及其底层的学习 Object: 超类(1)Object是类层次结构的顶层类,是所有类的 根类,超类。所有的类都直接或者间接的继承自Object类。所有对象…

    Linux 2023年6月7日
    081
  • Shiro结合Redis实现分布式或集群环境下的Session共享

    本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式或集群环境下的Session共享。在讲Session共享之前先说一下为什么要做Session共享。 什么是Sess…

    Linux 2023年5月28日
    0122
  • PYTORCH: 60分钟 | 训练一个分类器

    你已经知道怎样定义神经网络,计算损失和更新网络权重。现在你可能会想, 那么,数据呢? 通常,当你需要解决有关图像、文本或音频数据的问题,你可以使用python标准库加载数据并转换为…

    Linux 2023年6月16日
    0179
  • 【深度学习】神经网络前向传播简单实现

    步骤 输入层的每个节点与隐藏层的每个节点做点对点计算,加权求和 + 激活函数 利用同样的方法,计算隐藏层到输出层 隐藏层对加权结合后的结果使用激活函数,本例使用Sigmoid 最终…

    Linux 2023年6月13日
    095
  • sed命令

    对文件的操作无非就是”增删改查”,怎样用sed 命令实现对文件的”增删改查”,玩转sed 是写自动化脚本必须的基础之一 sed遵循简…

    Linux 2023年6月13日
    084
  • 浅谈kali : aircrack-ng套件

    aircrack-ng 套件包含有: Name Description aircrack-ng 破解WEP以及WPA(字典攻击)密钥 airdecap-ng airmon-ng 将…

    Linux 2023年6月14日
    070
  • C语言练习:hackerrank十五关

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    085
  • docker安装redis

    Redis configuration file example. # Note that in order to read the configuration file, Red…

    Linux 2023年5月28日
    090
  • postgresql 自增列 初始值设置

    — 获取自增列的名称 SELECT pg_get_serial_sequence(‘table_name’, ‘id’) AS sequence_name; –获取自增列的下一…

    Linux 2023年6月14日
    060
  • 常见的Redis面试”刁难”问题,值得一读

    字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、P…

    Linux 2023年5月28日
    078
  • windows系统如何查看端口被占用、杀进程

    查看系统当前所有的端口使用情况 命令:netstat -ano 查看特定端口是否被占用: netstat -ano |findstr “端口号” 查看到对应…

    Linux 2023年6月13日
    0103
  • 阿里云Linux-Centos8安装mysql8

    1. 安装MySQL &#x4F9D;&#x6B21;&#x6267;&#x884C;&#x4EE5;&#x4E0B;&#x…

    Linux 2023年6月14日
    082
  • Xbox分辨率突然变成640p

    今天XBox突然抽风还是发什么神经,输出分辨率突然变得非常模糊。一开始以为是HDMI线出现问题,后来用一条新的也是一样,所以就怀疑系统出了什么幺蛾子。 进入【电视和显示选项】——【…

    Linux 2023年6月13日
    0101
  • 剑指offer计划22( 位运算中等)—java

    1.1、题目1 剑指 Offer 56 – I. 数组中数字出现的次数 1.2、解法 救命,真不会用位运算,还是用哈希表做吧,位运算过段时间再学习~~~搞不来,虽然说哈…

    Linux 2023年6月11日
    075
  • Docker安装教程

    这里介绍两种安装方法:centsOS安装和Ubuntu安装 CentOS安装 linux内核版本建议3.8以上,作者本人使用的是3.10;查看内核版本命令:uname -r 一般C…

    Linux 2023年5月27日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球