当前位置: 首页 > news >正文

[ICPC 2021 Yokohama R] Cancer DNA

给定 \(m\) 个长度为 \(n\) 且由 \(\texttt{AGCT?}\) 五种字符组成的字符串 \(s_i\)

你需要求出由 \(\texttt{AGCT}\) 四种字符组成的随机字符串,能够匹配 \(\{s_1,s_2,\dots,s_m\}\) 中的至少一个字符串的概率。

你的答案与实际答案相对误差不能超过 \(5 \%\)

\(1 \leq n \leq 100\)\(1 \leq m \leq 30\)

这个问题看起来很不可做,考虑直接随机化。

我们每次随机一个字符串,可以在 \(O(nm)\) 的时间复杂度内求出每个字符串的匹配情况。

如果我们使用这种方法,相对误差会很大,这很不牛。

考虑答案更加准确的暴力。我们考虑钦定需要匹配的字符串,进行容斥即可,这样的时间复杂度是 \(O(nm \times 2^m)\) 的。

我们考虑将 \(m\) 个字符串分成两部分,对左右两边暴力做一遍,再减去同时匹配两边的概率。

这样就直接随机字符串了,准确率会大大提升。

#include<iostream>
#include<cstdio>
#include<random> 
#include<ctime>
using namespace std;
mt19937 rnd(time(0));
char ch[40][110],tmp[110];
double ans[1<<15];
double p1,p2,p3;
int main(){int n,m;scanf("%d %d",&n,&m);for(int i=0;i<m;i++){for(int j=1;j<=n;j++){cin>>ch[i][j];}}int mid=m>>1;int l_len=mid,r_len=m-mid;for(int i=0;i<(1<<l_len);i++){int cnt=0;bool ok=true;for(int j=1;j<=n;j++){cnt++;int flag1=0,flag2=0,flag3=0,flag4=0;for(int k=0;k<l_len;k++){if(i&(1<<k)){if(ch[k][j]=='A'){flag1=1;}if(ch[k][j]=='G'){flag2=1;}if(ch[k][j]=='C'){flag3=1;}if(ch[k][j]=='T'){flag4=1;}}}if(flag1+flag2+flag3+flag4>1){ok=false;}else if(flag1+flag2+flag3+flag4==0){cnt--;}}if(!ok){ans[i]=0;}else{ans[i]=1;for(int j=1;j<=cnt;j++){ans[i]/=4;}}if(i){double cmd=-1;for(int j=0;j<l_len;j++){if(i&(1<<j)){cmd*=-1;}}p1+=ans[i]*cmd;}}for(int i=0;i<(1<<r_len);i++){int cnt=0;bool ok=true;for(int j=1;j<=n;j++){cnt++;int flag1=0,flag2=0,flag3=0,flag4=0;for(int k=0;k<r_len;k++){if(i&(1<<k)){if(ch[k+mid][j]=='A'){flag1=1;}if(ch[k+mid][j]=='G'){flag2=1;}if(ch[k+mid][j]=='C'){flag3=1;}if(ch[k+mid][j]=='T'){flag4=1;}}}if(flag1+flag2+flag3+flag4>1){ok=false;}else if(flag1+flag2+flag3+flag4==0){cnt--;}}if(!ok){ans[i]=0;}else{ans[i]=1;for(int j=1;j<=cnt;j++){ans[i]/=4;}}if(i){double cmd=-1;for(int j=0;j<r_len;j++){if(i&(1<<j)){cmd*=-1;}}p2+=ans[i]*cmd;}}for(int i=1;i<=1000000;i++){for(int j=1;j<=n;j++){tmp[j]="AGCT"[rnd()%4];}bool flag1=false,flag2=false;for(int j=0;j<m;j++){bool flag=true;for(int k=1;k<=n;k++){if(ch[j][k]!='?'  &&  ch[j][k]!=tmp[k]){flag=false;}}if(flag){if(j<mid){flag1=true;}else{flag2=true;}}}if(flag1  &&  flag2){p3+=0.000001;}}cout<<p1+p2-p3;return 0;
}
http://www.jsqmd.com/news/200678/

相关文章:

  • 智谱新星GLM-4.6V-Flash-WEB深度解析:高并发下的视觉AI解决方案
  • GLM-4.6V-Flash-WEB模型在雪地搜救行动中的视觉辅助判断
  • 收藏必备!AI Agent记忆系统全解析:短期+长期记忆架构设计与实战指南
  • 西安交通大学软件学院——分布式系统练习题(简答题)
  • 真双端口RAM在FPGA中使用
  • GLM-4.6V-Flash-WEB模型在风筝冲浪运动安全监控中的应用
  • GLM-4.6V-Flash-WEB与HuggingFace镜像网站结合使用的最佳实践
  • GLM-4.6V-Flash-WEB模型对台风降雨量分布的图像推测
  • 西安交通大学软件学院——分布式系统练习题(选择题)
  • GLM-4.6V-Flash-WEB模型对森林火灾烟雾图像的早期识别
  • kafka组件原理
  • 西安交通大学软件学院——分布式系统练习题(填空 判断)
  • GLM-4.6V-Flash-WEB模型能否识别候鸟迁徙中途停歇时长?
  • 开发者必看:如何在实时交互系统中集成GLM-4.6V-Flash-WEB?
  • 深度测评自考必备!9个AI论文网站TOP9全解析
  • 基于 Python 的简易 Web 应用防火墙(WAF)设计 与实现 信息安全技术课程设计
  • GLM-4.6V-Flash-WEB模型在攀岩保护点设置中的图像建议
  • 某AI独角兽提示工程架构师:处理模型偏见的6步落地流程
  • GLM-4.6V-Flash-WEB模型能否识别珊瑚礁鱼类共生关系?
  • GLM-4.6V-Flash-WEB模型在热气球航线规划中的图像分析支持
  • GLM-4.6V-Flash-WEB模型在热气球飞行员行为监控中的应用
  • GLM-4.6V-Flash-WEB模型对极昼极夜现象图像的地理学理解
  • GLM-4.6V-Flash-WEB模型对冻土融化迹象的遥感图像分析
  • 信创环境下SpringBoot大文件上传的适配与优化
  • GLM-4.6V-Flash-WEB模型对沙尘暴能见度的图像估算能力
  • 2026年知名的现场大屏评分系统,线上评分系统,比赛打分软件厂家用户优选名录 - 品牌鉴赏师
  • Agent Memory 是什么?一文讲清它与 RAG、上下文工程、LLM Memory 的本质区别
  • GLM-4.6V-Flash-WEB模型在沙漠高压电塔巡检中的图像应用
  • 跨平台大文件上传在SpringBoot中的实现与讨论
  • 本地部署生产级RAG系统全攻略:从环境搭建到完整实现,值得收藏