彩色圆环

感谢名单

十分感谢 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

#include <bits/stdc++.h>
#define N 205
using namespace std; int n, m;
double ans;
double f[N][2], p[N]; int main ()
{
scanf ("%d%d", &n, &m);
p[1] = 1.0;
f[0][1] = 1;
for (int i = 2; i <= n; ++ i)
p[i] = p[i - 1] * (1.0 / m);
for (int i = 1; i <= n; ++ i)
{
for (int j = 0; j < i; ++ j)
{
f[i][0] += f[j][0] * p[i - j] * (i - j) * (m - 2) / m;
f[i][0] += f[j][1] * p[i - j] * (i - j) * (m - 1) / m;
/*不同情况分割线*/
f[i][1] += f[j][0] * p[i - j] * (i - j) / m;
}
}
ans = n * p[n];
for (int i = 1; i < n; ++ i)
{
ans += f[i][0] * p[n - i] * (n - i) * (n - i);
}
printf ("%.7lf", ans);
return 0;
}

[期望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. MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复

    起因是这样的,公司的领导表示说服务器崩了,修理好之后,只剩下数据库目录下的物理文件(即.frm文件与.ibd文件).然后,整了一份压缩包给我,叫我瞅一下能不能把数据恢复出来.我当场愣了一下,这都啥文件 ...

  2. [leetcode] 46. 全排列(Java)

    46. 全排列 这题我们可以借用31. 下一个排列写的nextPermutation函数来做,稍微改造一下即可 注意要先给nums排个序 class Solution { // 当没有下一个排列时re ...

  3. python异步编程之asyncio

    python异步编程之asyncio   前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率, ...

  4. Python+Selenium学习笔记11 - python官网的tutorial - 定义函数

    1 def f(a, L=[]): 2 L.append(a) 3 return L 4 5 print f(5) 6 print f(2) 输出 1 def f(a, L=None): 2 if L ...

  5. 为什么要用redux?

             redux解决的是react组件之间通信以及项目的状态变量的保存问题.如果不使用redux,随着项目的越来越大,组件之间通信越来越复杂,组件的状态越来越多,项目将越来越难以维护.使用 ...

  6. MLIR多级中间表示概述

    MLIR多级中间表示概述 MLIR项目是构建可重用和可扩展的编译器基础设施的一种新方法.MLIR旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建特定领域编译器的成本,并帮助将现有编译器连接在一 ...

  7. Redis系列(一):安装

    本系列介绍Redis,从安装到使用,太简单的使用不介绍了,介绍一些比较有意思的功能,也会介绍一些原理性的东西.本篇先介绍Redis的单实例安装.Redis还可以做到高可用,通过哨兵和集群可以做到高可用 ...

  8. Netty 框架学习 —— 传输

    概述 流经网络的数据总是具有相同的类型:字节,这些字节如何传输主要取决于我们所说的网络传输.用户并不关心传输的细节,只在乎字节是否被可靠地发送和接收 如果使用 Java 网络编程,你会发现,某些时候当 ...

  9. fiddler抓取手机APP包相关的设置

    一.设置手机的代理服务器 1.前提:手机与电脑用的是同一个网络 2.fiddler设置允许远程连接,并设置好端口 3.查询电脑所在网络的ip地址(windows下,命令行窗口使用:ipconfig进行 ...

  10. 最新版robotframework4.0.3版本安装

    python最新版本已经到了3.9了.对应的最新版本也更新到robotframework4.0.3. robotframework支持的自动化测试的类型以及需要的库: 1.ui自动化测试:Seleni ...