首先这肯定是个期望dp。
首先明确二点
1.一旦这张牌已经知道数字了,下次翻他肯定是给他配对
2.如果已经知道了两张相同数字的卡片,那么在之后什么时候翻面都不会影响操作次数
故dp状态只需要记录只知道一张的卡片数量和未知的卡片数量。
接下来一个问题就是对于一个状态,他的最优操作是什么
首先凭感觉我们可以知道,当未知的牌数量很多的时候,翻两张比较优秀。因为通过基本的概率论计算我们可以知道翻一张知道点数和一张未知点数的卡片,两者相同的概率只有
1(知道一张的卡片数量)×(未知卡片数量)\frac{1}{(知道一张的卡片数量)\times(未知卡片数量)} (知道一张的卡片数量)×(未知卡片数量)1​
是一个非常小的值,如果失败则不如翻两张未知的。
接下来我们手动模拟一下小样例的情况:
首先模拟1张已知1张未知,毫无疑问只需要一次操作。
首先模拟1张已知3张未知,通过简单的计算我们可以得到翻两张未知更加优秀,同时通过计算过程我们可以发现未知牌数增多会增加翻"一张已知一张未知“的操作次数期望。
然后模拟2张已知2张未知,通过计算我们发现第一次操作翻一张已知一张未知更加优秀(在这里你可能会很失望,感觉找不出规律了)。
然后模拟2张已知4张未知,通过简单的计算我们可以得到翻两张未知更加优秀。
最后模拟3张已知3张未知同样的我们第一步得到翻两张未知更加优秀。
好,振奋人心!其余的情况我们可以通过单调性来得到
经过探索我们发现,除了(1,1),(2,2)这两种特殊情况的最优操作比较奇怪以外,另外的状态就直接无脑翻两张未知就可以了。good!那让我们来仔细的分类讨论一下(这是我的草稿纸展示捏)

一共有四种情况,这里我们记已经知道数字(但是反面)的牌的数量是kkk(know),不知道数字的牌的数量是dkdkdk(don’t know)(谁能不夸我英语好)
我们翻了两张未知的各个情况的概率
一、两张未知的牌都是没有出现过的数字但是恰好他们的点数一样

二、两张未知的牌都是没有出现过的数字但是他们的点数不一样

三、一张是已经出现过的数字,一张是没有出现过的数字

四、两张未知的牌都是出现过的数字

那么转移就很简单啦,我们记录这四个概率为p1,p2,p3,p4p_1,p_2,p_3,p_4p1​,p2​,p3​,p4​
dpk,dk=p1×(1+dpk,dk−2)+p2×(1+dpk+2,dk−2)+p3×(2+dpk,dk−2)+p4×(3+dpk−2,dk−2)dp_{k,dk}=p_1\times (1+dp_{k,dk-2})\\+p_2\times (1+dp_{k+2,dk-2})\\+p_3\times (2+dp_{k,dk-2})\\+p_4\times(3+dp_{k-2,dk-2}) dpk,dk​=p1​×(1+dpk,dk−2​)+p2​×(1+dpk+2,dk−2​)+p3​×(2+dpk,dk−2​)+p4​×(3+dpk−2,dk−2​)
注意上文讨论过的(1,1)=1和(2,2)=5/2的特殊转移哦

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int mod=1e9+7;
ll poww(ll a,ll b){ll t=1;while(b){if(b&1)t=t*a%mod;a=a*a%mod;b>>=1;}return t;
}
void add(int &a,int b){a+=b;if(a>=mod)a-=mod;
}
void del(int &a,int b){a-=b;if(a<0)a+=mod;
}
int dp[2505][2505];
int dfs(int k,int dk){if(dp[k][dk]!=-1)return dp[k][dk];if(k==1&&dk==1)return dp[k][dk]=1;if(k==2&&dk==2){dp[k][dk]=1ll*5*poww(2,mod-2)%mod;return dp[k][dk];}dp[k][dk]=0;int tk,tdk;///两个未知一样tk=k,tdk=dk-2;if(tk>=0&&tdk>=0&&tdk>=tk&&(tdk-tk)%2==0){add(dp[k][dk],1ll*(1+dfs(tk,tdk))%mod*(dk-k)%mod*poww(dk*(dk-1),mod-2)%mod);}///两个未知不一样tk=k+2,tdk=dk-2;if(tk>=0&&tdk>=0&&tdk>=tk&&(tdk-tk)%2==0){add(dp[k][dk],1ll*(1+dfs(tk,tdk))%mod*(dk-k)%mod*(dk-k-2)%mod*poww(dk*(dk-1),mod-2)%mod);}///一个未知tk=k,tdk=dk-2;if(tk>=0&&tdk>=0&&tdk>=tk&&(tdk-tk)%2==0){add(dp[k][dk],1ll*(2+dfs(tk,tdk))%mod*(dk-k)%mod*2%mod*k%mod*poww(dk*(dk-1),mod-2)%mod);}///两个已知tk=k-2,tdk=dk-2;if(tk>=0&&tdk>=0&&tdk>=tk&&(tdk-tk)%2==0){add(dp[k][dk],1ll*(3+dfs(tk,tdk))%mod*k%mod*(k-1)%mod*poww(dk*(dk-1),mod-2)%mod);}//printf("%d %d %d\n",k,dk,dp[k][dk]);return dp[k][dk];
}
int main()
{//init(200000);memset(dp,-1,sizeof(dp));int n,m;scanf("%d%d",&n,&m);unordered_map<int,int>mp;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int t;scanf("%d",&t);if(t!=0)mp[t]++;}}int cnt1=0,cnt2=0;for(auto [fi,se]:mp){if(se==1)cnt1++;else cnt2++;}printf("%d",(cnt2+dfs(cnt1,n*m-cnt2*2-cnt1))%mod);return 0;
}
/*
5 2
0 0 1 0 0
*/

清楚姐姐玩翻翻乐[期望dp]相关推荐

  1. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  2. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  3. 【bzoj4318】OSU! 期望dp

    题目描述 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...

  4. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  5. 【高斯消元】兼 【期望dp】例题

    [总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $           ...

  6. Luogu P3251 [JLOI2012]时间流逝 期望dp

    题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...

  7. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  8. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  9. string (KMP+期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description  给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串 ...

最新文章

  1. mysql.err日志分析_Mysql日志解析
  2. block才会执行 mono_C-BLOCK录制《我要上春晚》,目测会上湖南分会场
  3. ES6中的super
  4. 《剑指offer》链表分割
  5. EasyUI 表格点击右键添加或刷新 绑定右键菜单
  6. 史上最简单的隐马尔可夫模型讲解
  7. 微课|玩转Python轻松过二级(1.5节):安装扩展库
  8. 开发中,常用到的Eclipse快捷键
  9. perl和python的相互调用
  10. 了解HTML CSS选择器操作和特性
  11. Vue中使用Bscroll @click无法执行的问题
  12. nginx中$host、$http_host和$proxy_host区别
  13. 如何升级maven版本
  14. excel表格自动填充为汉字拼音首字母
  15. mapbox加载高程图结果谷歌浏览器提示无法初始化WebGl???
  16. 线性回归、岭回归、逻辑回归、聚类
  17. vue全家桶开发的一些小技巧和注意事项
  18. c语言编写图书检索系统,求C语言编写图书管理系统
  19. Android 形状绘制 —— shape详解
  20. Gnocchi 9、gnocchi聚合算法分析

热门文章

  1. JAVA中Robot类的运用,实现‘别踩白块’游戏辅助
  2. 【论文阅读】An Image Patch is a Wave: Quantum Inspired Vision MLP
  3. 某大厂程序员吐槽外包员工是大爷,晚上八点就想下班,叫他加班却被怼!网友:怼得没毛病!...
  4. 【数据分析】2021年北京交通大学计算机学院学术型博士录取数据分析
  5. C++ 中虚函数的用法
  6. SW练习_栅栏2_unionfind_凸包
  7. IOS 图片自动旋转
  8. python操作windows窗口一个小case
  9. 【悟空云课堂】第二十三期:对XML外部实体引用的不当限制(CWE-611 :Improper Restriction of XML External Entity Reference)
  10. 废止173项国家建筑标准设计