uva 1368 DNA Consensus String

本文介绍了一种使用Hamming距离来确定多个动物DNA中特定基因X的共识序列的方法,并通过示例展示了如何找到最接近给定序列集的共识序列及其错误计数。

Description

Figure 1.

DNA (Deoxyribonucleic Acid) is the molecule which contains the genetic instructions. It consists of four different nucleotides, namely Adenine, Thymine, Guanine, and Cytosine as shown in Figure 1. If we represent a nucleotide by its initial character, a DNA strand can be regarded as a long string (sequence of characters) consisting of the four characters A, T, G, and C. For example, assume we are given some part of a DNA strand which is composed of the following sequence of nucleotides: “Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine” Then we can represent the above DNA strand with the string “TAACTGCCGAT.”

The biologist Prof. Ahn found that a gene X commonly exists in the DNA strands of five different kinds of animals, namely dogs, cats, horses, cows, and monkeys. He also discovered that the DNA sequences of the gene X from each animal were very alike. See Figure 2.

DNA sequence of gene X
Cat: GCATATGGCTGTGCA
Dog: GCAAATGGCTGTGCA
Horse: GCTAATGGGTGTCCA
Cow: GCAAATGGCTGTGCA
Monkey: GCAAATCGGTGAGCA
Figure 2. DNA sequences of gene X in five animals.

Prof. Ahn thought that humans might also have the gene X and decided to search for the DNA sequence of X in human DNA. However, before searching, he should define a representative DNA sequence of gene X because its sequences are not exactly the same in the DNA of the five animals. He decided to use the Hamming distance to define the representative sequence.

The Hamming distance is the number of different characters at each position from two strings of equal length. For example, assume we are given the two strings “AGCAT” and “GGAAT.” The Hamming distance of these two strings is 2 because the 1st and the 3rd characters of the two strings are different. Using the Hamming distance, we can define a representative string for a set of multiple strings of equal length. Given a set of strings S= {s1, …, sm} of length n, the consensus error between a string y of length n and the set S is the sum of the Hamming distances between y and each si in S. If the consensus error between y and S is the minimum among all possible strings y of length n, y is called a consensus string of S. For example, given the three strings “AGCAT”, “AGACT”, and “GGAAT”, the consensus string of the given strings is “AGAAT” because the sum of the Hamming distances between “AGAAT” and the three strings is 3 which is minimal. (In this case, the consensus string is unique, but in general, there can be more than one consensus string.) We use the consensus string as a representative of the DNA sequence. For the example of Figure 2 above, a consensus string of gene X is “GCAAATGGCTGTGCA” and the consensus error is 7.

Input

Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case starts with a line containing two integers m and n which are separated by a single space. The integer m (4 <= m <= 50) represents the number of DNA sequences and n (4 <= n <= 1000) represents the length of the DNA sequences, respectively. In each of the next m lines, each DNA sequence is given.

Output

Your program is to write to standard output. Print the consensus string in the first line of each case and the consensus error in the second line of each case. If there exists more than one consensus string, print the lexicographically smallest consensus string.

The following shows sample input and output for three test cases.

Sample Input

3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA

Sample Output

TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12

找与这些串最相近的串,输出不相同的总个数~还有就是要按字典序输出;

#include<stdio.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char s[110][110];
        int n,m,i,j,ss=0;
        scanf("%d%d",&m,&n);
        getchar();//字符串输入时注意回车!!!
        for(i=0; i<m; i++)
        {
            for(j=0; j<n; j++)
                scanf("%c",&s[i][j]);
            getchar();
        }
        for(j=0; j<n; j++)
        {
            int a=0,t=0,c=0,g=0,sum=0;
            for(i=0; i<m; i++)
            {
                if(s[i][j]=='A')
                    a++;
                if(s[i][j]=='T')
                    t++;
                if(s[i][j]=='C')
                    c++;
                if(s[i][j]=='G')
                    g++;
            }
            int maxn=max(max(a,t),max(c,g));
            if(maxn==a)
            {
                printf("A");
                sum=t+c+g;
            }
            else if(maxn==c)
            {
                printf("C");
                sum=a+t+g;
            }
            else if(maxn==g)
            {
                printf("G");
                sum=a+t+c;
            }
            else if(maxn==t)
            {
                printf("T");
                sum=a+c+g;
            }
            ss=ss+sum;
        }
        printf("\n");
        printf("%d\n",ss);
    }
}
代码转载自:https://pan.quark.cn/s/f87b8041184b Language: 中文 欢迎来到戈戈圈! 当你点开这个存储库的时候,你会看到戈戈圈的图标↓ 本图片均在知识共享 署名-相同方式共享 3.0(CC BY-SA 3.0)许可协议下提供,如有授权遵照授权协议使用。 那么恭喜你,当你看到这个图标的时候,就代表着你已经正式成为了一名戈团子啦! 欢迎你来到这个充满爱与希望的大家庭! 「与大家创造更多快乐,与人们一起改变世界。 」 戈戈圈是一个在中国海南省诞生的创作企划,由王戈wg的妹妹于2018年7月14日正式公开。 戈戈圈的创作类型广泛,囊括插画、小说、音乐等各种作品类型。 戈戈圈的目前成员: Contributors 此外,支持戈戈圈及本企划的成员被称为“戈团子”。 “戈团子”一词最初来源于2015年出生的名叫“团子”的大熊猫,也因为一种由糯米包裹着馅料蒸熟而成的食品也名为“团子”,不仅有团圆之意,也蕴涵着团结友爱的象征意义和大家的美好期盼,因此我们最终于2021年初决定命名戈戈圈的粉丝为“戈团子”。 如果你对戈戈圈有兴趣的话,欢迎加入我们吧(σ≧︎▽︎≦︎)σ! 由于王戈wg此前投稿的相关视频并未详细说明本企划的信息,且相关视频的表述极其模糊,我们特此创建这个存储库,以文字的形式向大家介绍戈戈圈。 戈戈圈自2018年7月14日成立至今,一直以来都秉持着包容开放、和谐友善的原则。 我们深知自己的责任和使命,始终尊重社会道德习俗,严格遵循国家法律法规,为维护社会稳定和公共利益做出了积极的贡献。 因此,我们不允许任何人或组织以“戈戈圈”的名义在网络平台或现实中发布不当言论,同时我们也坚决反对过度宣传戈戈圈的行为,包括但不限于与戈戈圈无关的任何...
内容概要:本文详细介绍了一个基于YOLOv8的血细胞智能检测系统全流程开发指南,涵盖从环境搭建、数据准备、模型训练与验证到UI交互系统开发的完整实践过程。项目利用YOLOv8高精度、高速度的优势,实现对白细胞、红细胞和血小板的自动识别与分类,准确率超过93%,单张图像检测仅需0.3秒。通过公开或自建血细胞数据集,结合LabelImg标注工具和Streamlit开发可视化界面,构建了具备图像上传、实时检测、结果统计与异常提示功能的智能系统,并提供了论文撰写与成果展示建议,强化其在医疗场景中的应用价值。; 适合人群:具备一定Python编程与深度学习基础,从事计算机视觉、医疗AI相关研究或项目开发的高校学生、科研人员及工程技术人员,尤其适合需要完成毕业设计或医疗智能化项目实践的开发者。; 使用场景及目标:①应用于医院或检验机构辅助医生进行血涂片快速筛查,提升检测效率与一致性;②作为深度学习在医疗影像领域落地的教学案例,掌握YOLOv8在实际项目中的训练、优化与部署流程;③用于学术论文写作与项目成果展示,理解技术与临床需求的结合方式。; 阅读建议:建议按照“数据→模型→系统→应用”顺序逐步实践,重点理解数据标注规范、模型参数设置与UI集成逻辑,同时结合临床需求不断优化系统功能,如增加报告导出、多类别细粒度分类等扩展模块。
基于蒙特卡洛,copula函数,fuzzy-kmeans获取6个典型场景进行随机优化多类型电动汽车采用分时电价调度,考虑上级电网出力、峰谷差惩罚费用、风光调度、电动汽车负荷调度费用和网损费用内容概要:本文围绕多类型电动汽车在分时电价机制下的优化调度展开研究,采用蒙特卡洛模拟、Copula函数和模糊K-means聚类方法获取6个典型场景,并在此基础上进行随机优化。模型综合考虑了上级电网出力、峰谷差惩罚费用、风光可再生能源调度、电动汽车负荷调度成本以及电网网损费用等多个关键因素,旨在实现电力系统运行的经济性与稳定性。通过Matlab代码实现相关算法,验证所提方法的有效性与实用性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、智能电网、电动汽车调度相关工作的工程技术人员。; 使用场景及目标:①用于研究大规模电动汽车接入电网后的负荷调控策略;②支持含风光等可再生能源的综合能源系统优化调度;③为制定合理的分时电价政策及降低电网峰谷差提供技术支撑;④适用于学术研究、论文复现与实际项目仿真验证。; 阅读建议:建议读者结合文中涉及的概率建模、聚类分析与优化算法部分,动手运行并调试Matlab代码,深入理解场景生成与随机优化的实现流程,同时可扩展至更多元化的应用场景如V2G、储能协同调度等。
04-25
<think>好的,我现在需要帮助用户查找UVA 1368问题的相关信息或解决方案。首先,用户提到的UVA 1368,我应该先确认这个问题的具体名称或内容。根据UVA题库的编号,UVA 1368对应的题目通常是“DNA Consensus String”,也就是DNA一致字符串问题。不过,为了确保准确,我需要回想一下常见的UVA题目编号或者是否有其他可能。 接下来,我需要回忆这个问题的大致内容。DNA Consensus String问题通常是给定多个DNA序列,要求找到一个共识序列,使得该序列到所有给定序列的总汉明距离最小。同时,还需要确定这个最小的总距离是多少。汉明距离是指两个等长字符串在相同位置上不同字符的个数。例如,对于每个位置,共识字符应该是出现次数最多的那个,如果有多个,则选择字母序最小的,比如在A和C出现次数相同时选A。 然后,我需要考虑如何解决这个问题。通常的解决步骤是: 1. 对每个位置统计出现的字符频率。 2. 对于每个位置,选择频率最高的字符,如果存在多个,则选字典序最小的。 3. 计算每个位置上的字符与所有原序列在该位置的差异之和,得到总汉明距离。 接着,我需要验证是否有相关的参考资料或解题方法。用户提供的引用中并没有直接提到UVA1368,但根据问题类型,可能需要处理字符串处理和统计,这与引用中的位运算或暴力法可能不同。不过,引用中的UVA11205涉及位运算和暴力枚举,虽然问题不同,但方法可能有参考价值,比如如何高效地遍历所有可能性。不过,在DNA问题中,可能不需要暴力枚举,而是逐位处理。 另外,用户可能希望得到具体的实现方法或代码示例。因此,我需要考虑如何用Python或其他语言实现这个问题的解决方案。比如,如何高效地统计每个位置的字符频率,并选择正确的字符,同时累加差异。 可能的Python代码结构如下: - 读取输入,首先读取测试用例数,然后对于每个用例,读取m和n(m个长度为n的DNA序列)。 - 对于每个位置0到n-1,统计A、C、G、T的出现次数。 - 确定该位置的共识字符,并计算该位置的总差异(m - 最大出现次数)。 - 累加所有位置的总差异,并构建共识字符串。 需要注意的是,处理输入时,要正确解析每个DNA序列,并确保所有序列长度相同。此外,当多个字符出现次数相同时,选择字典序最小的,这可以通过按字母顺序比较来实现。 然后,我需要检查是否有常见的错误或优化点。例如,在统计频率时,可以按字母顺序遍历(如A、C、G、T),这样当频率相同时,自然选择字母序靠前的,无需额外比较。这样可以简化代码逻辑。 最后,生成相关问题,可能涉及类似的问题,如其他字符串处理问题,汉明距离的应用,或者更复杂的共识算法。例如,如何扩展问题到更长的序列,或者处理不同的约束条件。 总结,UVA1368的解决方案关键在于逐位统计字符频率,选择最优字符,并计算总差异。代码实现需要注意输入处理和字符比较的顺序。</think>### UVA 1368 DNA共识字符串问题解析 UVA 1368题目要求从多个等长的DNA序列中找到一个**共识字符串**,使得该字符串与所有输入序列的**总汉明距离最小**。汉明距离定义为两个字符串在相同位置字符不同的数量。 #### 解决步骤 1. **输入处理**:读取$m$个长度为$n$的DNA序列。 2. **逐列统计**:对每个位置$i$($0 \leq i < n$)统计字符$\{A,C,G,T\}$的出现次数。 3. **选择最优字符**:每列选择出现次数最多的字符,若次数相同则选字典序最小的(例如A优先于C)。 4. **计算总距离**:总汉明距离为每列非共识字符的数量之和。 #### 示例代码 ```python def find_consensus(): import sys input = sys.stdin.read().split() idx = 0 t = int(input[idx]) idx += 1 for _ in range(t): m, n = int(input[idx]), int(input[idx+1]) idx +=2 dna = input[idx:idx+m] idx +=m consensus = [] total = 0 for col in range(n): count = {'A':0, 'C':0, 'G':0, 'T':0} for row in range(m): count[dna[row][col]] +=1 max_char = max(['A','C','G','T'], key=lambda c: (count[c], -ord(c))) consensus.append(max_char) total += m - count[max_char] print(''.join(consensus)) print(total) find_consensus() ``` #### 复杂度分析 - 时间复杂度:$O(m \cdot n)$,遍历每个字符位置。 - 空间复杂度:$O(n)$,存储统计结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值