栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

题目集9:12 病毒序列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

题目集9:12 病毒序列

题目

时至至今,疫情还没结束,战斗并未停止!现如今,疫情肆虐全球,疫情的传播加速了病毒的变异,α病毒,β病毒,δ病毒,相继出现…

而小A对病毒的变异来了兴趣,带着高中学过的生物知识,小A了解到病毒可以表示为由A,U,C,G四种碱基组成的基因序列,而病毒的变异便来自于不同基因序列结合。在此,我们将两个不同的基因序列的结合定义为:两个基因序列上下排布,通过一定的错位,使得两个基因序列的部分碱基可以对应起来,若分属两个基因序列的A与U对应则形成3个氢键,若分属两个序列的C与G对应会形成2个氢键,如图所示:

顽固的病毒为了保证自己结构的稳定性,在变异过程中总会选择形成氢键个数最大的方式进行结合。现在给定两个基因序列,他们结合后的氢键个数是多少?

PS:题目描述的“结合”仅仅为本题目描述所定义,不一定符合真实的生物学性质。

输入格式:

两行,每行一个字符串,分别是两个待结合的基因序列。(保证字符串只有A,U,C,G组成,且字符串的长度小于等于5000).

输出格式:

一行一个整数,表示结合后的最大氢键个数。

输入样例:
AGC
UUCG
输出样例:
7
样例解释

共有6种可能的结合方式

AGC
UUCG

AGC
 UUCG
    
AGC
  UUCG
         
 AGC
UUCG

  AGC
UUCG

   AGC
UUCG

其中形成氢键的个数分别为:3,0,0,7,0,0
则病毒序列会选择氢键个数为7的方式进行结合

题解 分析

对于两个病毒序列一定是有一个较长一些(不短于另一个),这样就可以看成一个短的字符串在一个长的字符串上依次移动。

具体类型我是分成了三种:

代码
#include
#include
void swap(char** p1, char** p2);
int main()
{
	char virus_1[5000 + 1] = { "" }, virus_2[5000 + 1] = { "" };
	int len_1, len_2,max = 0,sum = 0;
	scanf("%s %s", virus_1, virus_2);
	len_1 = strlen(virus_1);
	len_2 = strlen(virus_2);
	char* p1 = virus_1, * p2 = virus_2;
	if (len_1 > len_2)
	{
		int c;
		c = len_1;
		len_1 = len_2;
		len_2 = c;
		swap(&p1, &p2);
	}
	for (int i = 1; i < len_1 + len_2; i++)
	{
		if (i < len_1)
		{
			for (int j = 0; j < i; j++)
			{
				if ((p1[j] == 'C' && p2[len_2 - i + j] == 'G')
					|| (p1[j] == 'G' && p2[len_2 - i + j] == 'C'))
				{
					sum += 2;
				}
				if ((p1[j] == 'A' && p2[len_2 - i + j] == 'U')
					|| (p1[j] == 'U' && p2[len_2 - i + j] == 'A'))
				{
					sum += 3;
				}
			}
		}
		else
		{
			if (i >= len_1 && i <= len_2)
			{
				for (int j = 0; j < len_1; j++)
				{
					if ((p1[j] == 'C' && p2[len_2 - i + j] == 'G')
						|| (p1[j] == 'G' && p2[len_2 - i + j] == 'C'))
					{
						sum += 2;
					}
					else
					{
						if ((p1[j] == 'A' && p2[len_2 - i + j] == 'U')
							|| (p1[j] == 'U' && p2[len_2 - i + j] == 'A'))
						{
							sum += 3;
						}
					}
				}
			}
			else
			{
				if (i > len_2)
				{
					for (int j = 0; j < len_1 + len_2 - i; j++)
					{
						if ((p1[i - len_2 + j] == 'C' && p2[j] == 'G')
							|| (p1[i - len_2 + j] == 'G' && p2[j] == 'C'))
						{
							sum += 2;
						}
						else
						{
							if ((p1[i - len_2 + j] == 'A' && p2[j] == 'U')
								|| (p1[i - len_2 + j] == 'U' && p2[j] == 'A'))
							{
								sum += 3;
							}
						}
					}
				}
			}
		}
		if (sum > max)
		{
			max = sum;
		}
		sum = 0;
	}
	printf("%d", max);
	return 0;
}

void swap(char** p1, char** p2)
{
	char* p;
	p = *p1;
	*p1 = *p2;
	*p2 = p;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号