清楚姐姐玩翻翻乐[期望dp]

news2024/9/25 13:15:41

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

二、两张未知的牌都是没有出现过的数字但是他们的点数不一样
在这里插入图片描述

三、一张是已经出现过的数字,一张是没有出现过的数字
在这里插入图片描述

四、两张未知的牌都是出现过的数字
在这里插入图片描述
那么转移就很简单啦,我们记录这四个概率为 p 1 , p 2 , p 3 , p 4 p_1,p_2,p_3,p_4 p1,p2,p3,p4
d p k , d k = p 1 × ( 1 + d p k , d k − 2 ) + p 2 × ( 1 + d p k + 2 , d k − 2 ) + p 3 × ( 2 + d p k , d k − 2 ) + p 4 × ( 3 + d p k − 2 , d k − 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,dk2)+p2×(1+dpk+2,dk2)+p3×(2+dpk,dk2)+p4×(3+dpk2,dk2)
注意上文讨论过的(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
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多微网优化调度(风机、光伏、蓄电池、燃料电池、柴油机、电网交互)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【c语言进阶】文件操作(上)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;> c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是…

【C++11新特性】| 并发编程

文章目录一、std::thread1.1 成员函数1.2 案例二、std::mutex三、std::lock3.1 lock_guard3.2 unique_lock3.3 lock_guard与unique_lock的对比四、std::atomic五、volatile六、condition_variable成员函数七、future、promise、packaged_task7.1 std::promise7.2 std::future7.…

【Cloudcone】VPS 登录、防火墙设置

服务器登录、防火墙设置本来是一件很简单的事情&#xff0c;但是我买了国外服务器&#xff0c;有些地方出现了一些问题。 文章目录一、简介二、使用ipv6登录服务器三、防火墙设置四、小插曲一、简介 我一直用的腾讯云的服务器&#xff0c;但是带宽太低了&#xff0c;只有4M。最…

2023年二月份图形化三级打卡试题

活动时间 从2023年 2月1日至1月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; &#xff08;1&#xff09;小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 &#xff08;2&#xff09;小朋友做完题目后&…

CSS第四章——文本属性

文章目录4.1 文本颜色4.2 对齐文本4.3 装饰文本4.4 文本缩进4.5 行间距一些学习笔记。 CSS Text&#xff08;文本&#xff09;属性可定义文本的外观&#xff0c;比如文本的颜色、对齐文本、装饰文本、文本缩进、行间距等。 属性表示注意点color文本颜色通常使用十六进制 而且…

【算法题解】13. 删除链表的倒数第 N 个结点

文章目录题目解法一&#xff1a;计算链表长度Java 代码实现Go 代码实现复杂度分析解法二&#xff1a;双指针Java 代码实现Go 代码实现复杂度分析这是一道 中等难度 的题。 题目来自&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/ 题…

numpy快速交换行列

import numpy as np “”" 快速加换两行两列 “”" #交换两列第一列跟第三列 v1np.arange(100) v2v1.reshape((20,5)) v3v2[:,[0,3,2,1,4]] print(v3) “”" 快速交换两列 第一列跟第三列 “”" print() mask list(range(5))#生成一个0到4的列表 #快速…

[iHooya]2023年1月30日作业解析

温度统计 现有一段时间的温度数据&#xff0c;请统计指定温度出现的次数。 输入 第一行一个整数n,表示温度数据的个数。&#xff08;0 < n ≤ 200&#xff09; 第二行n个整数&#xff0c;以空格分隔&#xff0c;每个整数表示一个温度&#xff0c;温度的范围大于等于0&#…

OpenCV实战(9)——基于反向投影直方图检测图像内容

OpenCV实战&#xff08;9&#xff09;——基于反向投影直方图检测图像内容0. 前言1 反向投影直方图2. 反向投影颜色直方图3. 完整代码小结系列链接0. 前言 直方图是图像内容的一个重要特征。如果查看显示特定纹理或特定对象的图像区域&#xff0c;则该区域的直方图可以看作是一…

计算机网络之TCP全连接队列与半连接队列

什么是全、半连接队列 服务端接收syn请求后&#xff0c;内核会把该连接放入到半连接队列&#xff0c;服务端对synack返回ack后&#xff0c;会把连接从半连接队列移除&#xff0c;创建新的全连接&#xff0c;并把新的连接放入全连接队列 查看全连接队列的命令 全连接队列满了…

Deep Learning Tuning Playbook(深度学习调参手册中译版)

前言 由五名研究人员和工程师组成的团队发布了《Deep Learning Tuning Playbook》&#xff0c;来自他们自己训练神经网络的实验结果以及工程师的一些实践建议&#xff0c;目前在Github上已有1.5k星。原项目地址本文为《Deep Learning Tuning Playbook》中文翻译版本&#xff0…

聊一聊微信小程序生命周期你最想知道的一些事

目录 前言 解析 运行机制 总结 前言 &#xff08;1&#xff09;为什么是微信小程序 最近有人问我一些关于微信小程序的问题&#xff0c;今天有时间也就整理了一些微信小程序的相关资料&#xff0c;给大家简单系统总结一些微信小程序的相关知识及生命周期。 &#xff08;2…

使用光泵磁力仪(OPMs)非接触测量视网膜活动

使用光泵磁力仪&#xff08;OPMs&#xff09;非接触测量视网膜活动摘要绪论方法2.1参与者和测量设置2.2刺激2.3数据分析结果讨论原文见&#xff1a; https://www.sciencedirect.com/science/article/pii/S1053811921008016 摘要 光泵磁力仪&#xff08;OPM&#xff09;已被用…

关于提升销量和排名,亚马逊、wish、ebay卖家该怎么做?

新年好&#xff0c;我是龙哥测评&#xff0c;在这里祝愿所有跨境朋友在新的一年里财源滚滚&#xff0c;一切顺利。 接下来龙哥就来说说&#xff0c;为什么店铺销量提升不上去&#xff0c;产品曝光低转化率低&#xff0c;产品有排名但是没销量&#xff0c;等等这些问题&#xf…

5 个我们仍可 Solana 在熊市危机报有希望的原因

Daniel, 2022 年 1 月前面&#xff0c;我们发表了 《9 大指标分析 Solana 的熊市危机》。当查看数据时&#xff0c;有一个很好的论据&#xff0c;即 Solana 在 2021/2022 年期间严重超卖&#xff0c;该网络没有项目、TVL 或用户来维持自己度过长期的熊市。它的崩溃只是更严重&a…

QT/C++——主窗口和事件处理

一、主窗口 上面就是一个主窗口&#xff0c;主窗口中的每一个都是Action 这次新建工程要选择mainwindow #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QAction> #include <QTextEdit> #include <QLabel> #include &l…

LeetCode 剑指 Offer 09. 用两个栈实现队列

题目 解题 这道题是用两个栈实现一个队列&#xff0c;具有一个队尾添加元素和队头删除元素的功能 这里思路是一个进&#xff0c;一个出&#xff0c;里面的元素顺序很关键&#xff0c;要保持一个进栈最先进的元素在另一个出栈的栈顶 第一种方法是&#xff0c;每次进元素&#x…

冰冰学习笔记:信号

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

使用Postman快速访问MemFire Cloud应用

“超能力”数据库&#xff5e;拿来即用&#xff0c;应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库&#xff08;表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维&#xff09;&#xff0c;很大地降低开发者的使用门槛。 使用Post…