这是一个DP题。

我们设\(f[i][j][k]\)表示\(i\)序列长度中放入了\(j\)个元素,其中\(k\)是限定的众数的个数;状态转移方程是

\[f[k][i][j]=f[k][i-1][j-1]+f[k][i-1][j]-f[k][i-k-1][j-1]
\]

前面的两个相加应该比较好理解,也就是我们考虑从上一个长度转移过来,新加入的那个数是原先已经加入过的元素还是没有加入过的元素。

后面减去是因为要去掉不合法的情况——如果新加入的这个数出现了k+1次那么就显然是不合法情况。(注:\(i-(i-k-1)=k+1\))

因为是多组数据,但是数据范围并不大,而且我们的答案是一步一步推出来的的,所以针对每次询问都重新算一遍不如预处理方便。那么我们就在询问前进行预处理。

之后就是开一个g数组,\(g[i]\)表示的是众数个数小于等于i的时候的个数。之后我们就可以用原先算过的sum数组来累加g的值了。

但是要注意的是,最后一维我们不确定是那些数,而我们又要计算序列种类个数+需要的是不下降的序列,所以我们可以想到是组合数。然后也是同样的,考虑进行预处理。我们预处理从n个里面选出来i个数就行了qwq,但是因为n的范围很大,但我们需要的范围只在m以内,所以预处理到m即可。

最后我们用出现次数乘上它的种类个数再除以总和就是期望了。但是注意因为我们g数组相当于是在计算前缀和(因为要算总数个数),所以最后要差分。

最后注意精度问题,我们最好使用long double。(但是因为long double占用16个字节,是int 类型的4倍啊qwq),一定要注意空间是否会炸。。。。。)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,m,n;
long double C[255],sum[255][255][255],f[255][255][255],g[255]; int main(){
C[0]=true;
for(register int k=1;k<=251;++k){
sum[k][0][0]=1;
for(register int i=1;i<=251;++i){
for(register int j=1;j<=i;++j){
sum[k][i][j]=sum[k][i-1][j-1]+sum[k][i-1][j];
if(k<i) sum[k][i][j]-=sum[k][i-k-1][j-1];
}
}
}
while(cin>>m>>n){
memset(g,0,sizeof(g));
for(register int i=1;i<=m;++i)
C[i]=C[i-1]*(n-i+1)/i;
for(register int k=1;k<=m;++k)
for(register int j=1;j<=m;++j)
g[k]+=sum[k][m][j]*C[j];
long double ans=0;
for(register int k=1;k<=m;++k)
ans+=k*(g[k]-g[k-1])/g[m];
printf("%.4Lf\n",(double)ans);
}
return 0;
}

序列(DP)(组合数)的更多相关文章

  1. 72. Edit Distance(困难,确实挺难的,但很经典,双序列DP问题)

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  2. [OpenJudge90][序列DP+乱搞]滑雪

    滑雪 总时间限制: 1000ms 内存限制: 65536kB [描述] Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次 ...

  3. 序列DP(输出有要求)

    DP Time Limit:10000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status De ...

  4. noj 2033 一页书的书 [ dp + 组合数 ]

    传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 53            测试通过 : 1 ...

  5. 【区间dp+组合数+数学期望】Expression

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...

  6. hdoj5909 Tree Cutting(点分治+树上dp转序列dp)

    题目链接:https://vjudge.net/problem/HDU-5909 题意:给一颗树,结点带权值v[i]<m.求异或和为k的子树个数(0<=k<m). 思路: 首先点分治 ...

  7. 一类巧妙利用利用失配树的序列DP

    I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...

  8. Contest 20140708 testB dp 组合数

    testB 输入文件: testB.in  输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足 ...

  9. 2019 牛客暑期多校 G subsequence 1 (dp+组合数)

    题目:https://ac.nowcoder.com/acm/contest/885/G 题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零 思路:我们很容易就可以看 ...

  10. ZOJ 3791 An easy game DP+组合数

    给定两个01序列,每次操作可以任意改变其中的m个数字 0变 1  1 变 0,正好要变化k次,问有多少种变法 dp模型为dp[i][j],表示进行到第i次变化,A,B序列有j个不同的 变法总和. 循环 ...

随机推荐

  1. MySQL 执行 'use databases;' 时很慢

    问题描述: 就是这么个情况,登录数据库切换库时感觉很卡,需要等待几秒钟. 案例: shell > mysql -uroot -ppassword mysql> use databases; ...

  2. javascript变量,作用域和内存问题

    1:ECMAScript所有函数的参数都是按值传递的 function setName(obj){ obj.name="finn"; obj=new Object(); obj.n ...

  3. 自定义信息丰富的Android Log

    [问题背景] 最近在项目上需要用LOG来查看和定位一些信息,但是系统原生的LOG实在太乱,信息也不太多,比如调用行数,所在方法,所在类名,线程名称都没有. [初步想法] 本着开源的精神,首先去GitH ...

  4. 浅析 python中的 print 和 input 的底层区别!!!

    近期的项目中 涉及到相关知识 就来总结一下 ! 先看源码: def print(self, *args, sep=' ', end='\n', file=None): # known special ...

  5. jsp实现查询与展示功能

    今天做了一天的这个功能,开始是数据库一直打不开,显示Class not  found,一直调试,调试了一下午.原来是mysql的jar包,必须要放到WEB-INF这个目录下的lib文件夹中,然后bui ...

  6. 【HDU5862】Counting Intersections

    题意 有n条线段,且都平行于坐标轴.对于每条线段,给出两个端点的坐标.问一共有多少个线段的交点. 分析 最最简单的扫描法了.用线段树或者树状数组都可以. 由题目可知,线段只有两种,要么平行于x轴要么平 ...

  7. 5-SOM神经网络

    https://blog.csdn.net/gavinlyy/article/details/8302814 https://blog.csdn.net/u011314012/article/deta ...

  8. Android中的Handler介绍

    一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控 ...

  9. spring.net 继承

    . <object id="parent" type="Bll.Parent, HRABLL" > <property name=" ...

  10. Smarty配置与实例化

    在smarty文件夹下建立一个test文件夹,test下建立如下: 编辑test.php如下: <?php require('../smarty/Smarty.class.php'); $sma ...