[loj3526]修改DNA
如果$a[x..y]$和$b[x..y]$的某种字符数量不同,显然无解
考虑一个$[x,y]$的排列$p[x..y]$,使得$\forall x\le i\le y,a_{i}=b_{p_{i}}$,即最终要让$i$到$p_{i}$的位置
建有向边$(i,p_{i})$,由于每一个点入度和出度都为1,即构成若干个环,而一个大小为$l$的环仅需要交换$l-1$次即可,那么总交换次数为$(y-x+1)-$环数
问题即构造$p_{i}$并最小化交换次数,也即最大化环数
对于$a_{i}=b_{i}$的位置,令$p_{i}=i$即可,每一个位置都构成一个环
对于$a_{i}\ne b_{i}$的位置,仅关心于$(a_{i},b_{i})$这个二元组的个数,假设有$AT$个$(A,T)$、$AC$个$(A,C)$……
接下来,考虑环的形式,必然是形如$AT$和$TA$的二元组或$AT,CA$和$TC$的三元环
贪心优先选择前者,由于$a[x..y]$和$b[x..y]$的每种字符数量相同,若$AT$比$TA$多,必然$CA$比$AC$多,由此剩下的部分必然构成若干个三元环
(关于贪心的正确性,感性理解即可)


1 #include<bits/stdc++.h>
2 #include"dna.h"
3 using namespace std;
4 #define N 100005
5 int n,ans,tot[N][3][3],a[3][3];
6 int change(char c){
7 if (c=='A')return 0;
8 if (c=='T')return 1;
9 return 2;
10 }
11 void init(string a,string b){
12 n=a.length();
13 for(int i=0;i<n;i++){
14 memcpy(tot[i+1],tot[i],sizeof(tot[i]));
15 tot[i+1][change(a[i])][change(b[i])]++;
16 }
17 }
18 int get_distance(int x,int y){
19 for(int i=0;i<3;i++)
20 for(int j=0;j<3;j++)a[i][j]=tot[y+1][i][j]-tot[x][i][j];
21 for(int i=0;i<3;i++){
22 int s=0;
23 for(int j=0;j<3;j++)s+=a[i][j]-a[j][i];
24 if (s)return -1;
25 }
26 ans=y-x+1;
27 for(int i=0;i<3;i++)ans-=a[i][i];
28 for(int i=0;i<3;i++)
29 for(int j=i+1;j<3;j++)ans-=min(a[i][j],a[j][i]);
30 ans-=abs(a[0][1]-a[1][0]);
31 return ans;
32 }
[loj3526]修改DNA的更多相关文章
- POJ 3691 DNA Sequence (AC自动机 + 矩阵 有bug,待修改)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9889 Accepted: 3712 Desc ...
- Blender 之修改器代码分析
Blender的修改器(modifier)模块,默认界面右下块(Property)面板的扳手,分类(修改.生成.形变.模拟)列出所有的修改器.也可以空格键 ...
- AC自动机+DP HDOJ 2457 DNA repair(DNA修复)
题目链接 题意: 给n串有疾病的DNA序列,现有一串DNA序列,问最少修改几个DNA,能使新的DNA序列不含有疾病的DNA序列. 思路: 构建AC自动机,设定end结点,dp[i][j]表示长度i的前 ...
- 【POJ3691】DNA repair(AC自动机,DP)
题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...
- DNA repair问题
问题:Biologists finally invent techniques of repairing DNA that contains segments causing kinds of inh ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- DNA比对
[编程题](满分27分) 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为 ...
- DNA repair - HDU 2457(自动机+dp)
题目大意:给你N个DNA的串,也就是至包含'A','T','G','C'四种碱基的,这些给定的串都是带有遗传病的,然后给你一个不会超过1000的串,问你至少几个地方才能让这个串不包含遗传病,如果不论怎 ...
- DNA序列局部比对(Smith–Waterman algorithm)
生物信息原理作业第三弹:DNA序列局部比对,利用Smith–Waterman算法,python3.6代码实现. 实例以及原理均来自https://en.wikipedia.org/wiki/Smith ...
随机推荐
- xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- 如何基于Jupyter notebook搭建Spark集群开发环境
摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...
- SpringBoot-thymeleaf-静态资源引入和接管
引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...
- Salesforce 生命周期管理(一)应用生命周期浅谈
本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...
- HttpServletResponse 入门
继承体系 功能: 设置响应消息 1. 设置响应行 格式:HTTP/1.1 200 ok 设置状态码:setStatus(int sc) 2. 设置响应头:setHeader(String name, ...
- Java:NIO 学习笔记-2
Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...
- the Agiles Scrum Meeting 博客汇总
the Agiles 团队博客目录 一.Scrum Meeting 1. Alpha the Agiles Scrum Meeting 1 the Agiles Scrum Meeting 2 the ...
- Noip模拟51 2021.9.12
T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...
- 攻防世界 杂项 3.神奇的Modbus
[目标] 了解modbus协议 [工具] Wireshark [分析过程] 在数据包中寻找flag就行,flag是明文形式存储. 工业设备消息传输使用modbus协议.所以我就采集了modbus的通信 ...
- 从零开始 DIY 智能家居 - 基于 ESP32 的智能紫外线传感器模块
目录 前言 硬件选择 二.使用步骤 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与上报流程 总结 前言 做了这么多传感器都是自己玩,这次家里人看不下去了,非得 ...