彩色圆环

感谢名单

十分感谢 JA_Ma 为我讲解了 \(T1\) 的 期望DP 的思想和推论。

十分感谢 SSL_LYF 为我解答了 \(T1\) 的 期望DP 的概率的大小问题。

十分感谢 SSL_WJ 为我讲解了 高斯消元 的一些判断及一些基础知识。

(排名不分先后)

正文

T1

GMOJ \(link\)

这道题已经告诉你是 期望DP 了, 主要是 状态转移方程 的推导和 最后的 ans 进行求值

我们先预处理出每个区间的概率 \(g_i\) 以便于状态转移时使用。

再解释一下 \(f_{i, 1/0}\) 表示的是什么

其实表示的就是在前 \(i\) 个数中, 第 \(i\) 个数于首尾交界点是(1)否(0)相同的期望值。

然后我们就考虑怎么转移。

我们把这个环切成切成一条链, 我们期望一个区间 [j, i] 都是同一个颜色的, 然后我们就以 \(f_{j, 0/1}\) 进行转移。 我们只需将转移的期望乘目前区间的贡献再乘上这个区间都是同色的概率再乘于 \(m\) 种颜色中颜色的概率

然后我们进行分类讨论。

我们先考虑当 \(1\) 点与首尾交界点(我们人为添加的点, 这个点并不存在于链当中)不同色的情况。

这个情况我们还可以分两种类, 就是 \(i\) 点和这个 \(1\) 点的颜色是否相同两个可能

可以得出转移方程:

\[f[i][0] += f[j][0] * p[i - j] * (i - j) * (m - 2) / m;
\]

这个是色不同的, 因为总共有 \(m\) 个色, 所以就是 可选颜色数/m, 问题就是求可选色的数量。这里应为色不同, 所以就只有 \(m-1\) 中色可选, 又因区间 [j, i] 与 \(j-1\)前的区间的色也不一样(色一样的话这个区间就不之这么大了), 所以可选色只有 \(m-2\).

对于概率是 \(p_{i-j}\) 是因为他这个区间的色是相同的, 然后他的长度就为 \(i - j\), 所以这个区间他颜色相同的几率就是 \(p_{i - j}\), 而 \(i - j\) 就是这个区间的贡献

\[f[i][0] += f[j][1] * p[i - j] * (i - j) * (m - 1) / m;
\]

这个和上面的情况极为相近, 但是因为他 \(i\) 点和这个 \(1\) 点的颜色是相同的, 就有了些变化。

可选颜色就是被 \(j-1\) 前的区间占了一个, 所以就还有 \(m-1\)个颜色可选, 因为 \(i\) 点和这个 \(1\) 点的颜色相同, 所以是从 \(f_{j, 1}\) 状态转移过来的。

然后我们考虑最后一种可能了, 就是 \(1\) 点与首尾交界点同色的情况。

因为期望还是转移的期望乘目前区间的贡献再乘上这个区间都是同色的概率再乘于 \(m\) 种颜色中颜色的概率, 所以就和前一个也是差不多, 其实就是

\[f[i][1] += f[j][0] * p[i - j] * (i - j) / m;
\]

不同就是因为他是同色, 所以就不用考虑占色的情况

然后就是重头戏, 计算答案了。

首先, 我们可以 \(O(1)\) 可以过 \(n\) 的情况, 应为就一个色, 所以就是贡献 \(n~*~p_n\) 的情况

然后就是 1~n-1 的答案计算了

首先是他计算的这个期望 \(f_{i, 0}\) 然后就是 他这个出现的几率, 然后就是他这个区间是有 \(n - i\) 个点, 每个点是都可以产生这么多的贡献的。 还有, 就是这个区间他是可以每一个节点都作为一个断点(即将这个环断成链的点), 所以还是要乘上 \(n - i\) 的, 所以可以得到

\[ans += \left\{\begin{matrix}
n~~*~~p[n]\\ \prod_{n-1}^{i = 1}~~f_{i,0}~~* ~~p_{n~~-~~i}~~*~~(n-i)~~*~~(n-i)

\end{matrix}\right.\]

Code

  1. #include <bits/stdc++.h>
  2. #define N 205
  3. using namespace std;
  4. int n, m;
  5. double ans;
  6. double f[N][2], p[N];
  7. int main ()
  8. {
  9. scanf ("%d%d", &n, &m);
  10. p[1] = 1.0;
  11. f[0][1] = 1;
  12. for (int i = 2; i <= n; ++ i)
  13. p[i] = p[i - 1] * (1.0 / m);
  14. for (int i = 1; i <= n; ++ i)
  15. {
  16. for (int j = 0; j < i; ++ j)
  17. {
  18. f[i][0] += f[j][0] * p[i - j] * (i - j) * (m - 2) / m;
  19. f[i][0] += f[j][1] * p[i - j] * (i - j) * (m - 1) / m;
  20. /*不同情况分割线*/
  21. f[i][1] += f[j][0] * p[i - j] * (i - j) / m;
  22. }
  23. }
  24. ans = n * p[n];
  25. for (int i = 1; i < n; ++ i)
  26. {
  27. ans += f[i][0] * p[n - i] * (n - i) * (n - i);
  28. }
  29. printf ("%.7lf", ans);
  30. return 0;
  31. }

[期望DP][纪中]【2010集训队出题】彩色圆环的更多相关文章

  1. [JZOJ1904] 【2010集训队出题】拯救Protoss的故乡

    题目 题目大意 给你一个树形的网络,每条边从父亲流向儿子.根节点为原点,叶子节点流向汇点,容量为无穷大. 可以给一些边扩大容量,最多总共扩大\(m\)容量.每条边的容量有上限. 求扩大容量后最大的最大 ...

  2. [JZOJ1901] 【2010集训队出题】光棱坦克

    题目 题目大意 给你个平面上的一堆点,问序列\({p_i}\)的个数. 满足\(y_{p_{i-1}}>y_{p_i}\)并且\(x_{p_i}\)在\(x_{p_i-1}\)和\(x_{p_i ...

  3. [JZOJ1900] 【2010集训队出题】矩阵

    题目 题目大意 题目化简一下,就变成: 构造一个\(01\)数列\(A\),使得\(D=\sum A_iA_jB_{i,j}-\sum A_iC_i\)最大. 问这个最大的\(D\)是多少. 正解 其 ...

  4. 从《彩色圆环》一题探讨一类环上dp的解法

    清橙A1202 bzoj2201 bsoj4074 试题来源 2010中国国家集训队命题答辩 问题描述 小A喜欢收集宝物.一天他得到了一个圆环,圆环上有N颗彩色宝石,闪闪发光.小A很爱惜这个圆环,天天 ...

  5. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  6. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

  7. 高斯消元与期望DP

    高斯消元可以解决一系列DP序混乱的无向图上(期望)DP DP序 DP序是一道DP的所有状态的一个排列,使状态x所需的所有前置状态都位于状态x前: (通俗的说,在一个状态转移方程中‘=’左侧的状态应该在 ...

  8. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  9. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

随机推荐

  1. idea配置javaweb项目(最新版)

    idea(最新版)配置javaweb项目 本篇文章使用Maven构建javaweb环境 最新版maven压缩包 链接:https://pan.baidu.com/s/1El7b3YzPTZX-7QRE ...

  2. Linux(CentOS7)下配置多个tomcat

    记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...

  3. GO文件读写02---写文件

    缓冲式写入文件 func main034() { //创建并写入 //file, err := os.OpenFile("测试文件", os.O_CREATE|os.O_WRONL ...

  4. CVPR2020论文介绍: 3D 目标检测高效算法

    CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...

  5. 浅谈Gson和fastjson使用中的坑

    相信大家在代码编写中都用过Gson和fastjson吧,用来进行 Java对象和json字符串之间的转换. 本篇文章就主要介绍博主在工作中使用这两款工具时遇到的坑和对应的解决办法. 觉得有用的可以点个 ...

  6. 用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue

    前言 用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的.当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容.回 ...

  7. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  8. Oracle简单分析

    1.Oracle 数据库是甲骨文公司开发的一种关系型数据库管理系统,也就是RDBMS(relational database management system). 2.Oracle 从头到尾都是一个 ...

  9. Jenkins+Github+Nginx实现前端项目自动部署

    前言 最近在搭建一个自己的网站,网站框架搭好了要把项目放到服务器运行,但是每次更新网站内容就要手动部署一次,实在很麻烦,于是就想搭建一套自动化部署的服务.看了一些案例最后选用现在比较主流的Jenkin ...

  10. Java语言实现二维码的生成

    众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...